繁体   English   中英

在while循环中的fgets

[英]fgets inside the while loop

我在使用fgets遇到问题,因为它在k输入后第一次进入while循环时就返回\\n 由于我已经进入了while循环,并且已经#1 try#1 try ,因此该如何处理呢?

int main() {
    char r;

    printf("How to input?\n");
    printf("Keyboard ([K])\n File ([F])\n Leave ([E])\n");
    scanf("%c", &r);

    if (r == 'k' || r == 'K') {
        printf("\nKeyboard\n");
        opcaoTeclado();
    } else {
       // stuff
    }
}

void opcaoTeclado() {
    int try = 0;
    char inputline[161];

    while (try <= 10) {
        printf("\n#%d try\n ", try);
        fgets(inputline, 160, stdin);
        try++;
    }
}

调用scanf() ,输入中会有换行符,第一个调用fgets()会读取该换行符。 fgets()遇到换行符\\n时,将停止读取输入。 因此,它不会读取任何输入。

添加对getchar();的调用getchar(); scanf()立即使用换行符。

或者,如果输入中包含多个字符,也可以使用循环来使用。

int c;

while((c= getchar()) != '\n' && c != EOF); 

通常,最好避免将scanf()fgets()混合使用。 您可以使用fgets()而不是scanf()并使用不太容易的sscanf()来解析行。

您应该清理标准输入的缓冲区。 您可以使用fflush(stdin); 在循环之前。 但这是一个不好的风格。 还考虑fseek(stdin,0,SEEK_END);

您只需在格式后添加空格即可使用\\n

scanf("%c ", &r);
  1. 我在使用fgets时遇到问题,因为它在它第一次在“ k”输入之后进入while循环时返回\\ n。

    那是因为对于scanf("%c", &r); 当您输入k[ENTER_KEY] ,字符k将存储在变量r而在stdin流中保留\\n (按下ENTER键)。

    因此对于fgets(inputline, 160, stdin); ,它将在stdin找到\\n换行符,在stdin行中inputline它,并从man -s3 fgets退出:

    fgets()最多从流中读取小于大小的字符,并将它们存储到s所指向的缓冲区中。 在EOF或换行符之后停止读取。 如果读取换行符,则将其存储到缓冲区中。


  1. 由于我已经进入while循环并且已经编写了“#1 try”,因此该如何处理?

    您可以使用getchar()stdin使用该\\n

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM