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 NULL
到 espace
并且您正在尝试使用 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;
}
我是 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 NULL
到 espace
并且您正在尝试使用 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;
}