适当的字符处理

时间:2014-02-12 23:47:52

标签: c char scanf fflush

当使用gcc编译到Linux时,每次用户输入任何答案时,程序在其他迭代中到达代码的相同部分但不等待用户的输入,而是向scanf函数提供换行符,使程序打印'我不明白!'每次......程序有效,但我仍然不希望它写出“我不明白!”,独立于用户的回答。 这是代码的特定部分。

do
{
    printf("\n\nAnswer: (y/n) ");
    scanf("%c", &ans);
    //printf("\n->%c<-\n", ans); //just for debugging
    if (ans == 'y')
    {
        age += v[0];
    }
    else if (ans != 'n')
    {
        printf("\nI don't get it!\n");
    }
} while (ans != 'y' && ans != 'n');

这些是声明:
char v [64];
char ans;

(这个do..while循环在'for'里面) 令我感到震惊的是,程序编译和运行完全符合我在Windows上的预期......(使用MinGW) 我曾尝试在scanf之前和/或之后使用fflush(stdin),但它没有帮助。 一个重要的观察是,第一次达到这个问题时,它就像预期的那样。

  

(在用户回答之前)
  答案:(y / n)
  我不明白! //这是每次都写的,但是第一次

     

答案:(y / n)n

     

你今年21岁!

如果用户写入无效输入:

  

答案:(y / n)w

     

我不明白!

     

答案:(y / n)//这条线和下一条线应该根本不打印   我不明白!

     

答案:(y / n)
  //(现在它等待用户输入)

有什么想法吗?

修改

修正了它: (我宣布了一个额外的char buf[50]

do
{
    printf("\n\nAnswer: (y/n) ");
    fgets(buf, 50, stdin);
    sscanf(buf, " %c", &ans);
    if (ans == 'y')
    {
        age += v[0];
    }
    else if (ans != 'n')
    {
        printf("\nI don't get it!\n");
    }
} while (ans != 'y' && ans != 'n');

有人能告诉我scanf有什么问题吗?

2 个答案:

答案 0 :(得分:1)

停止使用scanf。现在

请改用fgets(buffer, BUFLEN, stdin)。然后使用sscanf来解析结果。它会更强大,它可以解决你的问题。

我听说它在格式说明符周围添加空格也有帮助,因为它摆脱了残留的“空白”。 scanf(" %c", &ans);但我不喜欢它。

更新这里是一段代码,我认为这些代码就像你想要的那样(我用printf语句替换了内部但是你明白了;我也替换了你的{{带有if的1}} - 我认为它更干净了:

switch

答案 1 :(得分:0)

关注@Floris回答fgets()


如果必须使用scanf(),请使用

scanf(" %c", &ans);

"%c"之前的空格将消耗任何和所有前导空格,包括前一行的 Enter '\n'

当然,您不希望添加以下空格,因为这会导致scanf()占用所有空白区域,直到输入另一个非空白区域为止。由于stdin通常是缓冲的,因此在将行提供给'\n'后需要非空白空格后,它们意味着额外的scanf()