0

以下 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”已经给出一样?

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

4

2 回答 2

4

第一的:

c[2] = '\n';

您的两个元素数组中没有c[2]。对ans.

第二:

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

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

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

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

于 2012-12-18T21:27:08.340 回答
1

为了建立 ouah 所说的getchar()返回一个 int 值,该值将是按下的任何键的十进制值。因此,您应该将用户的击键捕获为 int,然后将其类型转换为 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' 将随着每次旋转而增加,因此您的索引将自动更新。

于 2012-12-18T21:53:25.167 回答