[英]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
NULL
给espace
,并且您正试图通过使用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.