【问题标题】:Array of strings being overwritten被覆盖的字符串数组
【发布时间】:2014-08-05 15:48:38
【问题描述】:

我有一个程序正在尝试获取包含以下内容的文本文件并将其提供给我的其他程序。

Bruce, Wayne
Bruce, Banner
Princess, Diana
Austin, Powers

这是我的 C 代码。它试图获取文件中的行数,解析逗号分隔的键和值,并将它们全部放在字符串列表中。最后,它试图遍历字符串列表并将它们打印出来。这只是奥斯汀·鲍尔斯一遍又一遍的输出。我不确定问题是我如何将字符串附加到列表中,还是我如何读取它们。

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

int main(){
    char* fileName = "Example.txt";
    FILE *fp = fopen(fileName, "r");
    char line[512];
    char * keyname = (char*)(malloc(sizeof(char)*80));
    char * val = (char*)(malloc(sizeof(char)*80));
    int i = 0;
    int ch, lines;

    while(!feof(fp)){
        ch = fgetc(fp);
        if(ch == '\n'){ //counts how many lines there are
            lines++;
        }
    }
    rewind(fp);

    char* targets[lines*2];

    while (fgets(line, sizeof(line), fp)){
        strtok(line,"\n");
        sscanf(line, "%[^','], %[^',']%s\n", keyname, val);
        targets[i] = keyname;
        targets[i+1] = val;
        i+=2;
    }
    int q = 0;

    while (q!=i){
        printf("%s\n", targets[q]);
        q++;
    }

    return 0;
}

【问题讨论】:

  • 你正在使用lines未初始化
  • @mch,对我来说似乎是一个答案
  • sscanf(line, "%79[^,], %79[^\n]", keyname, val);

标签: c string parsing iteration key-value


【解决方案1】:

问题在于这两行:

targets[i] = keyname;
targets[i+1] = val;

这些不会复制字符串 - 它们只会复制它们指向的任何内存的地址。因此,在while 循环结束时,每对target 元素都指向相同的两个块。

要复制字符串,您要么必须使用strdup(如果提供),要么自己使用strlenmallocstrcpy 实现它。

另外,正如@mch 提到的,你永远不会初始化lines,所以虽然它可能为零,但它也可能是任何垃圾值(这可能导致char* targets[lines*2]; 失败)。

【讨论】:

  • 谢谢!这能够解决它。
  • 可能为零:可能是1
  • @BLUEPIXY 这就是为什么我之后立即提到“它也可能是任何垃圾值”
  • 程序不能正常工作如果最后一行不存在换行符。就算再保一把,也不会随便用。
【解决方案2】:

首先打开文件。在 while 循环中,检查条件以找到 \n 或 EOF 以结束循环。在循环中,如果您得到的不是字母数字,则将标记分开并将其存储在字符串数组中。遇到 \n 或 EOF 时增加计数。更好地使用 do{}while(ch!=EOF);

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多