【问题标题】:fgets not scanning second time through while loop Cfgets 没有通过 while 循环 C 进行第二次扫描
【发布时间】:2014-05-24 21:26:24
【问题描述】:

所以我制作了这个程序来扫描地址,然后询问用户是否要插入另一个地址或打印已经插入的地址。当我运行它时,我会检查一次,然后我为 &y 插入的内容会打印一个随机数,然后再次打印带有注释的行并扫描 &y。我觉得它第二次通过 do-while 循环跳过了 fgets 函数。救命!

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



int main (void)
{

    char address[10][100];
        int x;
    char y;

    for(x=0;x<10;x++){
         do {
           printf("Enter address %d:", x + 1); //prints this second time through

           fgets(address[x], 100, stdin); //doesnt scan for this second time through

           printf("Do you want to print address's inserted thus far or continue?(p or c):"); // prints this second time through also. 

            scanf("%d" , &y);

            if (y == "c") continue;

            else

               printf("%d" , &y);
               break;

    } while (strcmp(address[x], "\n") == 0);
}















return(0);  
}

【问题讨论】:

  • 注意编译器给你的错误信息。

标签: c loops while-loop scanf fgets


【解决方案1】:

fgets() 保存您输入的换行符,并添加一个 NULL 字符。
例如,尝试将值 100 更改为 99,以便腾出一些空间。

如果您的输入(包括换行符)超过 99 个字符,那么您需要通过读取虚拟字符来“刷新”输入,直到到达换行符为止。

【讨论】:

    【解决方案2】:

    您的代码:

            if (y == "c") continue;
    
            else
    
               printf("%d" , &y);
               break;
    

    缩进错误。 break; printf() 之后执行(而不是在continue; 之后),但从技术上讲,代码相当于:

            if (y == "c")
                continue;
            else
                printf("%d" , &y);
            break;
    

    但是,您的主要问题是 scanf("%d", &amp;y); 将换行符留在输入流中,因此下一个 fgets() 读取换行符并停止。此外,由于ychar,您应该使用scanf("%c", &amp;y); 读取值并使用if (y == 'c') 进行比较。

    【讨论】:

    • 建议(" %c", &amp;y); 并修复(y == "c")。我放弃了这篇文章。
    • 是的;好点。 %c 前面的空格不是立即关键,但比较应该是编译器警告,如果不是错误,并且...放弃似乎是合适的。
    • 有一个编译器警告谈论指针之间的比较这有什么关系?我该如何解决这个问题?
    • @user3521465:是的;我们应该使用y == 'c' 而不是y == "c"。将来自编译器的所有警告视为您的错误,尤其是在您没有添加任何“请发出更多警告”标志的情况下。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多