gpt4 book ai didi

c - (C 语言) 如何在使用 getchar() 时使用退格键;在这个功能?

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:26 27 4
gpt4 key购买 nike

你好抱歉,如果我无法理解,我是 c 编程的新手而且我不是最好的英语作家。

我的问题:我无法理解如何在使用代码时使用退格键,如果有人能向我解释它是如何工作的,我很高兴。

    #include <stdio.h>
int main()
{
char name[30], ch;
int i = 0;
printf("Enter name: ");
while(ch != '\n') // terminates if user hit enter
{
ch = getchar();
name[i] = ch;
i++;
}
name[i] = '\0'; // inserting null character at end
printf("Name: %s", name);
return 0;
}

当我运行这个程序时,我实际上可以写下我的名字,并且在我写的时候我可以使用退格键删除字符然后继续写,这怎么可能?因为据我所知,这段代码会在我点击后立即输入任何字符来命名数组。谢谢你,乔纳坦。

最佳答案

Yoni,你有两个很好的答案,但为了完整起见,我会在评论中提供你有疑问的剩余信息。

首先,当您想要显示任何输入并允许最少的用户编辑时,您需要将键盘置于非规范模式,以便您的程序可以使用每个按键作为键已键入——无需等待用户按下 Enter。您可以使用 tcgetattr(终端获取属性)和 tcsetattr(终端设置属性)来处理此问题。 *非规范模式是 Windows getch() 提供的。

本质上,您将读取循环设置为使用 getcharfgetc 读取(如果您希望能够从 stdin 或文件。)您可以通过以下方式控制读取循环:

#define MAXPW 32    /* constant for max input length */

int main (int argc, char **argv) {

int c,
idx = 0; /* buf index */
char pw[MAXPW] = "", /* buf for passwd */
mask = argc > 1 ? *argv[1] : 0; /* mask off by default */
FILE *fp = stdin;
...
/* read chars from fp, mask w/mask char */
while ((idx + 1 < MAXPW && (c = fgetc (fp)) != '\n' && c != EOF) ||
(idx == MAXPW - 1 && c == 127))
{

请注意,您正在读取一个字符,而 (1) (space_remains AND c 不是 '\n' EOF) 或 (2) (space_remains AND backspace_key_pressed)

即使你处理了这两种情况(1)它是一个普通的字符 - 添加它;或 (2) 是否为退格字符,然后备份,用 space 覆盖 char 并再次备份,例如

        if (c != 127) {                 /* not the backspace characters */
if (' ' - 1 < mask && mask < 127) /* if mask valid ASCII */
fputc (mask, stdout); /* output mask char */
else
fputc (c, stdout); /* output normal char */
pw[idx++] = c; /* store char, adv index */
}
else if (idx > 0) { /* handle backspace (del) */
fputc (0x8, stdout); /* backup */
fputc (' ', stdout); /* overwrite with space */
fputc (0x8, stdout); /* backup again */
pw[--idx] = 0; /* nul-termiante after current */
}

注意:如果您的mask字符是可打印字符,那么mask字符将被输出,例如

enter passwd: ********

如果桅杆不可打印(默认为 nul),则输出文本。您可以将掩码字符设置为程序的第一个参数(引号),例如

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/time.h>
#include <termios.h>
#include <errno.h> /* for errno */
#include <unistd.h> /* for EINTR */

#define MAXPW 32 /* constant for max input length */

int main (int argc, char **argv) {

int c,
idx = 0; /* buf index */
char pw[MAXPW] = "", /* buf for passwd */
mask = argc > 1 ? *argv[1] : 0; /* mask off by default */
FILE *fp = stdin;

struct termios old_kbd_mode; /* orig keyboard settings */
struct termios new_kbd_mode;

if (tcgetattr (0, &old_kbd_mode)) { /* save orig settings */
fprintf (stderr, "%s() error: tcgetattr failed.\n", __func__);
return -1;
} /* copy old to new */
memcpy (&new_kbd_mode, &old_kbd_mode, sizeof(struct termios));

/* put keyboard in non-canonical/no echo mode */
new_kbd_mode.c_lflag &= ~(ICANON | ECHO); /* new kbd flags */
new_kbd_mode.c_cc[VTIME] = 0;
new_kbd_mode.c_cc[VMIN] = 1;
if (tcsetattr (0, TCSANOW, &new_kbd_mode)) {
fputs ("error: tcsetattr failed.\n", stderr);
return -1;
}

fputs ("enter passwd : ", stdout); /* set passwd prompt */

/* read chars from fp, mask w/mask char */
while ((idx + 1 < MAXPW && (c = fgetc (fp)) != '\n' && c != EOF) ||
(idx == MAXPW - 1 && c == 127))
{
if (c != 127) { /* not the backspace characters */
if (' ' - 1 < mask && mask < 127) /* if mask valid ASCII */
fputc (mask, stdout); /* output mask char */
else
fputc (c, stdout); /* output normal char */
pw[idx++] = c; /* store char, adv index */
}
else if (idx > 0) { /* handle backspace (del) */
fputc (0x8, stdout); /* backup */
fputc (' ', stdout); /* overwrite with space */
fputc (0x8, stdout); /* backup again */
pw[--idx] = 0; /* nul-termiante after current */
}
}
pw[idx] = 0; /* null-terminate final string */

/* restore original keyboard mode */
if (tcsetattr (0, TCSANOW, &old_kbd_mode)) {
fputs ("error: tcsetattr failed.\n", stderr);
return -1;
}

printf ("\nstored passwd: %s\n", pw);
}

可编辑的输入

在没有掩码的情况下运行程序,假设用户输入:

$ ./bin/backspace
enter passwd : my_password_is_bad

(用户想了想并说“哦,这不好”,现在可以按 3 次退格键离开她的视线:

$ ./bin/backspace
enter passwd : my_password_is_

现在她完成了她的输入:

$ ./bin/backspace
enter passwd : my_password_is_good
stored passwd: my_password_is_good

操作与显示的掩码字符完全相同。当显示所有掩码字符并且用户忘记了她输入的内容时,她可以简单地在所有显示的字符上退格(如果她愿意,可以继续按下退格键,然后再次输入正确的密码(名称,随便什么)。带有 '*'mask 字符的示例,例如

$ ./bin/backspace '*'
enter passwd : *******************
stored passwd: my_password_is_good

在某些情况下,这是向用户提供最少编辑功能的便捷方式。如果您不需要屏蔽用户输入,那么您完全可以不用更改键盘模式。

检查一下,如果您有任何问题,请告诉我。

关于c - (C 语言) 如何在使用 getchar() 时使用退格键;在这个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53248523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com