c - 将 strtok() 与 fgets() 一起使用会导致段错误,但指针应该是正确的

标签 c file-io fgets strtok

我是 C 的新手,我想我会学到更多。我正在尝试编写一些代码来读取预先存在的文本文件并格式化并将其写入磁盘。当它编译时,每次我不确定我是否应该得到一个段错误时,我都会遇到一个段错误。我浏览了大部分手册页,但找不到任何突出的内容。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   FILE *file = fopen("listing.txt","r"), *output;

   char *fvar;
   char *svar;
   char delim[] = ",";
   int num;
   char ch;
   char line[66];
   int listnum = 0;

   if(file == NULL){
        printf("Cannot open file.\n");
        exit(1);
   }

   output = fopen("report.txt","w");

   fprintf(output, "%s", "First Name     Last Name     Number ");
   fprintf(output, "%s", "-------------------------------------");

   while(fgets(line, 66, file) != NULL){
       ch = line[0];
       if((ch >= 'a') && (ch <= 'z')){
           fvar = strtok(line,delim);
           svar = strtok(NULL,delim);
           listnum++;
       }
       else {
            num = atoi(line);
       }
       fprintf(output, "%s", fvar);
       fprintf(output, "%15s", svar);
       fprintf(output, "%30d", num);
       fprintf(output, "%56s", "\n");
   }
   fclose(file); /* done reading from the input file */
   fclose(output); /* done writing the the output file */
   return 0;
}

我想做的是读取文本文件的一行。如果该行以“string,string”的方式包含信息,则将它们标记化并将它们分别存储在 fvar 和 svar 中。如果是数字串,使用atoi()获取值存入num。

出于某种原因,这会导致段错误,尽管它可以正常编译。我很确定问题出在 fvar = strtok(temp,delim);svar = strtok(NULL,delim); 行中,但我不知道不知道怎么修改。注意:如果我使用 fvar = strtok(line,delim);,也会发生相同的行为。

编辑:已修复,感谢@Chris Dodd。按照我的意愿,我会去拿一本一年级的教科书,重新学习我的字母表。

最佳答案

最有可能的问题是你的第一行输入不是以小写字母开头,所以你从一开始就不会调用 strtok,也不会分配给 svar 或 fvar,但你仍然传递那些(未初始化的)值到 printf,然后给出段错误...

尝试使用调试器单步执行代码以查看它的实际位置。

关于c - 将 strtok() 与 fgets() 一起使用会导致段错误,但指针应该是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371538/

相关文章:

c++ - 数组类型的元素类型不完整,无法进行模式匹配

c++ - 如何在大文件上有效地使用文件输入/输出函数(使用有限大小的内存)

c++ - 如何从 txt 文件 c++ 中提取括号之间的数字?

c - 在 C 中的 I/O 期间打印的交替行

C Linux USB 驱动程序 |打印 URB 缓冲区内容的最佳方式

Java 运行时性能与 native C/C++ 代码的比较?

c - hsc2hs:用 Haskell 改变 C 结构

java - Backspace\b 关于操作系统的 Chacacter 作用域?

c - fopen 无法读取文件(文件始终等于 NULL)

使用 open() 替代 fputs()/fgets() 的 C 语言