【问题标题】:Reading keyboard input using cstdio使用 cstdio 读取键盘输入
【发布时间】:2026-02-11 17:15:02
【问题描述】:

以下 C 代码有什么问题? (更新)

int nfds = 0;
char c[2] = " ";
char ans[2] = " ";

printf("Test p or s [p,s]: p? ");
ans[0] = (char)getchar();
if (ans[0] != '\n')
  {
    ans[1] = '\0';
    printf("ans = %s\n", ans);
  }
else
  ans[0] = '\0';

/* FIXME: answering 's' -> nfds is never read */
printf ("Choose [0, 1, 2, 3]: 0? ");
c[0] = (char)getchar();
if (c[0] != '\n') 
  {
    c[1] = '\0';
    nfds = strtol(c, NULL, 10);
  }
else
  c[0] = '\0'
printf( "nfds=%d\n", nfds);

回答“return”有效,但回答“s+return”不会在 print("Choose...") 处停止,而是继续执行,就好像“return”已经给出一样?

也许更好的解决方案是:首先在ans中读取一个字符/字符串,默认:"return" in char/string='s'/"s" 询问下一个问题以读取整数nfds,默认:"return"

【问题讨论】:

  • 回答 s^D 有效,但不回答 s^J(\n=return)

标签: c string integer stdio


【解决方案1】:

第一:

c[2] = '\n';

您的两个元素数组中没有c[2]ans 也一样。

第二:

c[1] = getchar();
...
nfds = atoi(c);

您的数组有两个元素,并且字符串必须以空值结尾。通过覆盖c[1]c 数组不能容纳字符串。

还要注意getchar 返回int 而不是char,如果您必须将其返回值与EOF 进行比较,这一点很重要。

另外atoi函数不能做错误检查,你应该使用strtol

【讨论】:

  • char ans[2] = " "; 表示c[1] 值是空字符。如果覆盖c[1]ans 不再是字符串。
【解决方案2】:

要建立在 ouah 所说的基础上,getchar() 返回一个 int 值,该值将是按下的任何键的 decimal 值。因此,您应该将用户的击键捕获为 int,然后将 typecast 捕获为 char 并将其插入到您的 char 数组中。

int key_stroke;
char array[size]

key_stroke = getchar();
array[1] = (char)key_stroke;

如果我错了,请纠正我,但您正在尝试处理击键直到按下回车键?使用以下代码可以更简单、更干净地完成。

int key_stroke;
char array[size]

for(i = 0; ((char)key_stroke != '\n') && (i < size); i++)
{
  key_stroke = getchar();
  array[i] = (char)key_stroke;
}

用户按下的键将被添加到array[],直到按下回车键或直到数组空间用完。 'i' 会随着每次旋转而增加,因此您的索引会自动更新。

【讨论】:

  • 如何添加评论,“return”关闭评论??