使用cstdio读取键盘输入

时间:2012-12-18 21:23:58

标签: c string integer stdio

以下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);

回答“返回”是有效的,但回答“s + return”并不会停止打印(“选择...”)并继续,好像已经给出“返回”一样?

也许更好的解决方案是:首先读取ans中的字符/字符串,默认值:{/ 1}}在char / string ='s'/“s”中请求下一个问题读取整数{ {1}},默认:"return"

2 个答案:

答案 0 :(得分:4)

首先:

c[2] = '\n';

两个元素的数组中没有c[2]。与ans相同。

第二

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

您的数组有两个元素,字符串必须以null结尾。通过覆盖c[1]c数组不能保存字符串。

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

同样atoi函数无法进行错误检查,您应该使用strtol

答案 1 :(得分:1)

基于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'会随着每次旋转而增加,因此您的索引会自动更新。