我正在一个字符一个字符地读取文件。当我遇到冒号时,我想跳过所有字符,直到遇到换行符。实际上,在看到冒号后我希望跳到下一行(如果存在另一行)。 看起来很简单,但是当我尝试跳出我的第二个 while 循环时,我收到了一个 sigsegv,它跳过了我不关心的数据。
如果没有中断,代码的行为与我预期的一样(尽管不是我想要的输出)。也就是说,它读取数据直到第一个冒号,然后它会跳到 EOF 并退出。
5 FILE *fp = fopen("myFile", "r");
6 char *string = (char*) malloc(sizeof(char));
7 char *head = string;
8 if( fp ){
9 int c;
10 while( (c=fgetc(fp)) != EOF ){
11 if(c == ':'){
12 *string++ = '\n';
13 while( (c=fgetc(fp)) != EOF ){
14 if( c == '\n' ) // Skip to end of line
15 break; //removing break avoids sigsegv
16 }
17 }else{
18 *string++ = c;
19 }
20 }
21 }
似乎当我跳出循环时,c
或 fp
以某种方式被修改导致 sigsegv。我最好的猜测是 fp
以某种方式被修改并在父级 fgetc()
调用 fp
时生成此错误。不过,除此之外,我不确定是什么导致了这个问题。
最佳答案
您需要为string
分配更多字节。这一行:
char *string = (char*) malloc(sizeof(char));
仅为您的字符串分配一个字节。
关于C fgetc sigsegv - 跳到行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264449/