在c中标记字符串时出现seg错误

时间:2012-05-31 16:30:08

标签: c

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

有人能让我知道我做错了什么吗?这是我的代码部分给我的问题:

//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;
}

谢谢,我试着解释它,但是如果我错过任何东西让我知道。除了调试器之外,我不知道在这种情况下如何获得有意义的信息,如果有办法我可以获得更多有用的错误,请告诉我。

更新:抱歉,不知道怎么做。这是调试器中堆栈的副本(除了main之外,如果我点击它们,它们都说“No source available for ..”那么列表中的项目:

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    

2 个答案:

答案 0 :(得分:1)

fgets在错误或EOF时返回NULL。检查不是EOF

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

答案 1 :(得分: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, ",");
}

我的代码仍然远非完美的数据验证,但至少它不会在空行上抛出seg错误。