【问题标题】:Reading a text file separated by commas into a 2D array in C将用逗号分隔的文本文件读入C中的二维数组
【发布时间】:2018-04-05 15:42:03
【问题描述】:

我正在尝试将 5000 个名称的文件读入 C 中的二维数组,其格式如下:

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET"

目前,它只是给我“分段错误:11”。我正在尝试将每个名称读入其自己的二维数组,但我不知道如何执行此操作。到目前为止,这是我的代码:

//initialise array and chars
char names[5000][10] = {""};
int i;
char separator = ',';
char ch;

//open file
FILE *namesToBeSorted;
namesToBeSorted = fopen(argv[1], "r");
int j = 0;

//find file size
fseek(namesToBeSorted, 0L, SEEK_END);
int fileSize = ftell(namesToBeSorted);
rewind(namesToBeSorted);

//read from file into array
for (i = 0; i < fileSize; i++){
    fscanf(namesToBeSorted, "%c", &ch);
    while(ch != separator)
        names[i][j] = ch;
        fscanf(namesToBeSorted, "%c", &ch);
        j++;
}

//print array
for (i = 0; i<5; i++){
    for(j = 0; j < 10; j++){
        printf("%c\n", names[i][j]);
    }
}

感谢任何帮助。

【问题讨论】:

  • 请将您的代码转换为minimal reproducible example 并发布。
  • '目前,它只是给我“分段错误”所以现在是学习如何使用调试器的时候了。这对你和读者来说是一个更好的用途'时间。
  • 请注意,"PATRICIA" 是 11 个字符,包括 \0。您应该扫描引号,而不是逗号。并且您必须将\0 添加到每个名称中。
  • 显然您并不关心 NUL 终止符,每个字符串都需要由 NUL 终止(请阅读 C 教科书中处理字符串的章节)。有没有超过 9 个字符的名字?
  • 还要注意 fileSize 在翻译模式 (Windows) 下阅读并不准确,因为 0xd0xa 被翻译为单个 \n。更好地扫描直到 fscanf 返回 EOF。

标签: c arrays multidimensional-array


【解决方案1】:

我将尝试总结来自 cmets 的问题和我自己的一些意见...

names 中的每个字段都需要比最长名称长一个字符。如果您事先知道最大尺寸,只需对其进行硬编码。否则,您需要确保读取的字符数不超过您将字符串插入的缓冲区。让我们把它留给另一个问题;硬编码一些巨大的东西(例如 128 而不是 10),稍后再优化。

您缺少用于限定while(ch!=separator) 正文的尖括号。 C 不像 Python,缩进与作用域相同。

scanf 可用于提取字符串的一部分。不需要自己遍历每个字符。不确定这是否有效,但它应该跳过一个字符 ("),然后提取字符直到出现 ",跳过 ,,然后重复直到提取所有名称:

while(fscanf(namesToBeSorted, "\"%s\",", names[i++])); // terminates when fscanf fails to extract a name, see fscanf doc about its return value
i--; // adjusting counter. hacky hacky

scanf 是你的朋友。有了这个解决方案,就不需要fileSize

打印字符串而不是字符。否则,您将打印未为短于 max 的名称设置的字符。另外,如果打印单个字符串并希望自动换行,最好使用puts

while(i--) puts(names[i]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2023-02-02
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多