【问题标题】:Flush stdin using fgets使用 fgets 刷新标准输入
【发布时间】:2013-07-12 18:03:26
【问题描述】:

尝试通过控制台制作注册页面。 我需要几个输入,而且我正在使用 fgets,所以我需要刷新标准输入。 很多关于 Stack Overflow 的类似问题都重定向到这里:http://c-faq.com/stdio/stdinflush2.html。 我使用该链接获得了以下代码。但是,这实际上不起作用。它显示用户名:,然后当我输入用户名并按 Enter 时,它只是转到控制台中的一个新的空行,我可以在其中输入更多内容。 为什么会这样? 我该如何解决?

编辑:添加代码

NSLog(@"Do you have an account already?(1 for Yes, 0 for no)");
    fgets(cnumb1, 2, stdin);
    int c;
    while((c = getchar()) != '\n' && c != EOF);
    size_t length = strlen(cnumb1);
    if (cnumb1 [length-1] == '\n'){ // In case that the input string has 1 character plus '\n'
        cnumb1 [length-1] = '\0';} // Plus '\0', the '\n' isn't added and the if condition is false.
    NSString* string = [NSString stringWithUTF8String: cnumb1];
    if (string == 0) {
        while(numb4 == 1) {
            numb3 = 1;
            while( numb3 == 1){
                NSLog(@"Username:");
                fgets(usercheck1, 13, stdin);
                int c2;
                while((c2 = getchar()) != '\n' && c2 != EOF);
                size_t length1 = strlen(usercheck1);
                if (usercheck1 [length1-1] == '\n'){ // In case that the input string has 12 characters plus '\n'
                    usercheck1 [length1-1] = '\0';} // Plus '\0', the '\n' isn't added and the if condition is false.

【问题讨论】:

  • 如果你使用 fgets 你可以忘记标准输入缓冲区,你不必清理它。
  • 一般情况下是的,但只有当用户输入的字符少于缓冲区可以容纳的字符时。
  • @onitake 在我问了这个问题之后我发现 usercheck1 (实际上似乎并没有在这段代码中定义)应该定义为 char usercheck1 [任意大的数字]

标签: objective-c command-line stdin flush fgets


【解决方案1】:

完全重写了我的答案,看来我对问题的理解不够好。

在用户再次按下 return 之前,应该清空输入缓冲区的行将不会得到任何东西 - 除非用户输入的字符数超过输入缓冲区的容量。

您应该首先检查fgets 读取的字符串的长度,如果最后一个字符(\0 之前)是\n,请不要尝试读取更多字符。否则像你一样清空输入缓冲区。

【讨论】:

  • 无论返回多少,除了移动闪烁什么都做不了 |将光标移到另一行。 while 行的要点是它应该清除标准输入。我需要这个,因为如果我不这样做,下一个 fget 只会一遍又一遍地使用第一个输入,而我只能有那个输入。
  • 我明白了。但是,如果您尝试这样做,那么您遇到刷新问题,因为 shell 将等待下一个换行符,直到它为您提供任何字符。不过,您需要清除输入缓冲区似乎有点奇怪。 fgets 不应该给你任何你以前读过的东西。
  • 我让它通过 userInput4 搜索,如果它在那里找到任何空格,它会 NSLogs 它。如果我输入“a”,为什么它会给我这个错误?
  • 多加考虑一下,如果用户输入的字符多于缓冲区可以容纳的字符,您将获得不需要的先前数据。这些显然会溢出到下一个 fgets...
  • 我在 fgets 之前有一个 scanf(我在那里使用 scanf 只是因为用户应该只输入 1 或 0),当我在 scanf 中输入“0”时,它会跳过fgets 并给了我空间错误。 o.O
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多