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,它应该通过循环,然后如果用户 通过按 ENTER 键再次输入任何内容,它应该跳出循环并打印成功。

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

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

你能帮帮我吗?

缺陷是如果用户只按 ENTER,您期望 fgets 到 return NULL,但事实并非如此。在那种情况下,fgets return 只是换行符,所以 input 是字符串“\n”。然后 strchr 试图在字符串 "\n" 中找到一个 space 但是有 none,所以它 returns NULL 然后 espace[2] 取消引用 NULL 导致段错误。

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

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

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

当您只是按回车键而不是提供一些输入时,您将面临细分,在这种情况下,您的 strchr returns NULLespace 并且您正在尝试使用 identification = espace[2] - '0';

从中提取一些东西

使用下面的方法来防止 NULL 处理。

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