首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用strtok()和fget()会导致分段错误,但是指针应该是正确的。

使用strtok()和fget()会导致分段错误,但是指针应该是正确的。
EN

Stack Overflow用户
提问于 2011-12-03 22:27:04
回答 2查看 1.1K关注 0票数 1

我对C很陌生,我想我会学到更多。我正在尝试编写一些代码来读取预先存在的文本文件并格式化并将其写入磁盘。当它编译时,每当我不确定是否应该得到一个片段错误时,我都会得到一个片段错误。我翻阅了大部分的手册页,却找不到任何突出的地方。

下面是代码:

代码语言:javascript
运行
复制
#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);,也会发生相同的行为。

编辑:修正,谢谢克里斯·多德。按照我自己的意愿,我会去拿一本一年级的课本,再研究一下我的字母表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-03 22:48:00

最可能的问题是,您的第一个输入行不以小写字母开头,所以您从不首先调用strtok,也从不将其赋值给svar或fvar,但仍然将这些(未初始化的)值传递给printf,而printf则会产生分段错误……

尝试使用调试器对代码进行单步执行,以查看代码的实际用途。

票数 2
EN

Stack Overflow用户

发布于 2011-12-03 22:32:09

strtok可以返回空。如果忽略这种可能性,访问冲突很容易导致。始终检查您调用的函数的返回状态。

代码语言:javascript
运行
复制
fvar = strtok(temp, delim); 
if (fvar != NULL) 
{
    printf("%s\n", fvar);
    svar = strtok(NULL, delim);
    if (svar != NULL)
    {
        printf("%s\n", svar);
    }
    else
    {
        /* illegal to access contents of svar */
    } 
 } 
 else 
 {
     /* illegal to access contents of fvar */ 
 }

与问题无关的/*,您可能会发现包含文件ctype.h .h很有用,因为它提供了一个表单.的函数族.手推器,字母,数字等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8371538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档