2012-03-05 42 views
0

所以。用C编写应用程序,unix,我有函数,它要求用户输入,直到输入有效。 让直行:循环运行超过预期C

int inputX() 
{ 
    int result; 
    char input; 
    while(1) 
    { 
     printf("Input x (a, b, c, d, e, f, g, h) :"); 
     scanf("%c", &input); 
     result = validChar(input); 
     if (result >= 0) 
     { 
      return result; 
     } 
     else 
     { 
      printf("Invlid input. Lets try again.\n"); 
     } 
    } 
} 

validChar()检查,如果输入的是 - 小时。 如果我输入 - 一切都很好。 如果我输入例如1,输出是

Input x (a, b, c, d, e, f, g, h) :1 
Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) :Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) : 

我甚至试图睡眠(),但没有工作.. C是棘手:|

+1

为什么这个问题标记为'C++'? – 2012-03-05 19:54:26

+1

我怀疑有些数据留在输入缓冲区中。你在第二次迭代中检查了“输入”的内容吗?它会告诉你很多...... – 2012-03-05 19:55:56

+1

[C循环可能重复两次打印字符串? (使用scanf(“%c”))](http://stackoverflow.com/questions/9421926/c-loop-prints-string-twice-using-scanfc) – 2012-03-05 19:57:05

回答

4

使用这个把戏摆脱在缓冲区中留下的空白:

scanf(" %c", &input); 
    ^
+0

工程就像一个魅力!如果没有人告诉我,我觉得有多冷。谢谢:) – Wish 2012-03-05 20:03:29

+0

是的,这是我希望更好地教导的事情之一。与其他转换说明符(如%d','%i','%o','%x','%s','%f'等)的大多数(全部?)不同,'%c'转换说明符不会告诉'scanf'跳过任何前导空格。这是完全合乎逻辑的,因为有时候你想*读取一个空格字符,但它可能会导致你遇到的问题。你需要在'%c'之前使用上面的诀窍来获得相同的效果。 – 2012-03-05 23:19:13

0

使用scanf%c将使它吃任何字符。第二次运行可能是您输入的换行符。

0

第一次打电话1。第二个电话接到\n。阅读完整一行后解析出来。