繁体   English   中英

C - 在循环中使用 fgets() 出现分段错误

[英]C - Getting segmentation fault with the fgets() in a loop

我是 C 的新人,我的代码有一些问题。 我试图做一个循环来读取用户的每个输入,直到他按 ENTER 并退出循环以执行其他功能。 这是我的代码:

int main(char argc,char *argv[]){

    char input[200];
    char *epc;
    int err = 0;
    int idt = 0;

    while (fgets(input,200,stdin) != NULL){
        epc = strchr(input, ' ');
        idt = epc[2] - '0';

        if(idt == 1){
            err++;
        }

        }
    }
    printf("Success");
    return 0;
}

所以基本上如果有人输入5 01 ,它应该通过循环 go ,然后如果用户通过按 ENTER 键再次输入任何内容,它应该跳出循环并打印成功。

除了它不起作用而且我每次都在终端中遇到分段错误。

如果我用人工循环来做到这一点,例如 while(i<3) 和 i++ 在循环结束时中断,它确实有效。

你能帮帮我吗?

缺陷在于,如果用户仅按 ENTER,您希望fgets返回NULL ,但事实并非如此。 在那种情况下, fgets只返回换行符,所以input是字符串“\n”。 然后strchr尝试在字符串“\n”中找到一个空格,但没有,所以它返回NULL ,然后espace[2]取消引用NULL导致段错误。

如果您希望循环在用户仅按下 ENTER 时中断,那么您需要测试获取字符串“\n”。 你可以做类似的事情

 while (fgets(input,100,stdin) != NULL){
     if(input[0] == '\n'){
         break;
     }

另请注意,还有其他输入会导致问题。 第一个空格后面的字符少于 2 个的任何内容(例如“0 1”)都会导致espace[2]索引到字符串终止符或更远。

当您只按 enter 而不是提供一些输入时,您正面临分段,在这种情况下,您的strchr NULLespace ,并且您正试图通过使用identification = espace[2] - '0';

使用以下方式来防止 NULL 处理。

#include <stdio.h>
#include <string.h>
int main(char argc,char *argv[])
{
    char input[200];
    char *epc;
    int err = 0;
    int idt = 0;
    printf("Enter some words\n");
    
    while (fgets(input,100,stdin) != NULL){
        
        printf("input is : %s\n", input);
        
        epc = strchr(input, ' ');
        
        if(epc)
        {
            idt = epc[2] - '0';
            
            if(idt == 1){
                    err++;
                }
        }
    }
    printf("Success");
    return 0;
}

暂无
暂无

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

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