2012-05-31 35 views
0

我刚刚在几天前开始在C编程,所以我确定我在做一个菜鸟错误,但我不确定是什么。我的程序打开一个文件,逐行读取它,然后删除我不需要的东西(括号,换行符等),然后一旦我以逗号分隔的格式拥有数据,我想将它添加到数组中然后将该数组添加到数组中)。我正在使用逗号分隔的字符串进行标记,但当我在调试器中运行它时,我总是收到EXC_BAD_ACCESS, Could not access memory.在c中标记字符串时得到一个seg错误

有人能让我知道我做错了什么吗?下面是我的代码是给我的问题节:

//now data(variable: line) looks like this: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4 
char *str_ptr; 
str_ptr = strtok(line, ","); 
    for(; str_ptr != NULL ;){ 
    fprintf(stdout, "%s\n", str_ptr); 
    str_ptr = strtok(NULL, ","); 
    } 

如果有帮助(忽略它,如果上面是足够有用),这里是我的全部代码:

#include <stdio.h> 

int main() { 

    char line[1024]; 
    FILE *fp = fopen("/Users/me/Desktop/output.txt","r"); 

    printf("Starting.. \n"); 
    if(fp == NULL) { 
     return 1; 
    } 
    int count = 0; 
    int list[30]; //items will be stored here 

    while(fgets(line, 1024, fp) != EOF) { 
     count++; 
     //parse the text in the line Remove the open bracket, then remove the last newline,comma and close bracket 
     // data looks like this: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4], 
     size_t len = strlen(line); 
     memmove(line, line+1, len-4); 
     line[len-4] = 0; 
     printf("%s \n",line); 

     //parse the numbers in the char 
     //now data looks like this: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4 
     char *str_ptr; 
     str_ptr = strtok(line, ","); 
      for(; str_ptr != NULL ;){ 
      fprintf(stdout, "%s\n", str_ptr); 
      str_ptr = strtok(NULL, ","); 
      } 


     //for testing just stop the file after two lines 
     if (count == 2) { 
      break; 
     } 


     if (count > 1000000) { 
      printf("count is higher than 1,000,000 \n"); 
      count = 0; 
     } 
    } 
    printf(" num of lines is %i \n", count); 

    return 0; 
} 

谢谢,我试着按我看到的解释它,但如果我错过了任何事情,请告诉我。除了调试器之外,我不确定如何在这种情况下获得有意义的信息,如果有方法可以获得更多有用的错误,请告诉我。

更新:对不起,不知道该怎么做。这里是堆栈在调试器中的副本(除主外,如果我点击他们,他们都说“没有可用的源..”,然后在列表中的项目:

Thread [1] (Suspended : Signal : EXC_BAD_ACCESS:Could not access memory)  
    strlen() at 0x7fff875ef4f0 
    __vfprintf() at 0x7fff875908c3 
    vfprintf_l() at 0x7fff8758f18e 
    fprintf() at 0x7fff87598d9a 
    main() at learningC.c:77 0x100000d5a  
+0

你会得到段错误吗? – interjay

+0

@interjay我没有意识到我多次得到这个错误。我从调试器发布堆栈。有帮助还是有其他一些我可以得到的信息? –

回答

1

fgets返回上NULL错误或EOF。检查是否有不为EOF

while(fgets(line, 1024, fp) != NULL){ 
+0

我仍然遇到同样的问题。如果我在尝试标记字符时将部分注释掉了,那么程序就会完成,但是当我在早期结束时添加它时。 –

+0

它在这里运行得很好(几乎没有修改代码):http://ideone.com/aQY2g – SuperSaiyan

+0

它在短于4的行上仍然失败; – wildplasser

1

我看不出有什么错的,如果输入的文件始终是有效的。我试图编译和我的Mac上运行它,它的工作真的很好。也许你可以上传示例文件,这样我们就可以看到发生了什么,因为memmove部分的代码太脆弱了对于无效输入(例如空行或短行)。我建议将其更改为

char* data = line; 
size_t len = strlen(line); 
if (len > 3) { 
    line[len - 3] = '\0'; 
    data++; 
} 

char *str_ptr; 
str_ptr = strtok(data, ","); 
for(; str_ptr != NULL ;){ 
    fprintf(stdout, "%s\n", str_ptr); 
    str_ptr = strtok(NULL, ","); 
} 

我的代码还远远没有完善的数据验证,但至少它不会抛出赛格在空行故障。