【问题标题】:Printing out an array of strings in C在 C 中打印出一个字符串数组
【发布时间】:2015-04-19 20:19:52
【问题描述】:

我正在尝试读取一个包含 10 行的文件,如下所示:

000000 52.3 65.2 98.7 96.3 100.0 25.0 95.6 98.7 82.5 63.1
111111 81.0 68.6 54.2 96.3 74.2 78.6 98.5 62.1 64.7 75.0
222222 52.6 63.5 25.4 42.6 32.0 22.1 52.3 96.6 98.5 63.2
333333 98.2 65.3 65.4 93.5 32.6 37.5 63.5 91.0 96.3 82.5
444444 96.3 85.2 74.1 36.9 25.8 14.7 12.3 13.4 63.5 98.4
555555 93.6 82.5 74.1 63.1 65.2 63.5 98.7 63.2 63.8 64.0
666666 95.2 61.5 97.8 52.3 63.3 33.3 44.4 55.5 66.6 77.7
777777 11.1 22.2 33.3 44.4 55.5 66.6 77.7 88.8 99.9 100.0
888888 12.3 23.4 34.5 45.6 56.7 67.8 78.9 89.1 91.1 98.1
999999 98.7 87.6 76.5 65.4 54.3 43.2 32.1 21.0 52.9 87.1

我需要将文件逐行读入一个字符串,所以目前我有:

#include<stdio.h>

int main()
{
    FILE *p;
    char *line[10], *buffer; //Array of strings and a buffer string
    int a;
    p = fopen("assign6.dat", "r+");
    for(a = 0; a < 10; a++) {
        fscanf(p, "%[^\n]", buffer); //Read until we reach a newline
        fgetc(p); //Read the newline
        line[a] = buffer;
        printf("%s\n", line[a]);
    }
    for(a = 0; a < 10; a++) {
        printf("%s\n", line[a]);
    }
    fclose(p);
    return 0;
}

所以我声明了一个指向 char 的指针数组来存储所有 10 行数据。第一个 printf 语句打印出正确的数据。但是,第二个 for 循环中的第二个 printf 语句一遍又一遍地打印出文件的最后一行(10 次)。那么为什么这些 printf 语句在它们是相同的东西时打印我们不同的东西。

【问题讨论】:

    标签: c arrays file


    【解决方案1】:

    复制字符串

    你需要改变这个:

    line[a] = buffer;
    

    到这里:

    strcpy(line[a], buffer);
    

    它会起作用的。原因是line[a]buffer 是指针,通过使它们相等,您最终将指向内存中的相同地址。

    What is strcpy?

    Whis is this the case?

    分配内存

    您需要为您的字符串分配内存,但您还没有这样做。

    从你的文件来看,改变这个:

    char *line[10], *buffer;
    

    到这里

    char line[10][129], buffer[129];
    

    是一个快速的解决方案。我分配了 129 个字符,因为文件的字符串的最大长度为 6,我们需要为 null character 多留一个空间。你可以随意改变它。否则,您可能需要动态分配内存。

    How to dynamically allocate memory using malloc

    【讨论】:

    • 可能也需要分配给line[a]
    • 数组是否需要 char line[10][128] 而不是您所说的,因为 7 不足以读取整行
    • 如果每行的最大长度为 128 个字符,则分配 129 个(空字符为 +1)。我很抱歉只使用了 7,我脑子里有别的东西。但通常这取决于您的文件。感谢您的评论。
    【解决方案2】:

    因为缓冲区是指向内存的指针。每次运行 fscan() 时都会写入缓冲区指向的字符串,并且 line[a] 都具有缓冲区指针的值,因此它们都指向相同的内存位置。在那个位置只存储最后一行。

    例如,您需要使用

    来存储每一行
    strcpy(line[a], buffer); // Instead of line[a] = buffer;
    

    【讨论】:

      【解决方案3】:

      两个问题:

      没有为buffer分配内存。

      fscanf(p, "%[^\n]", buffer);
      

      没有为line[a]分配内存

      line[a] = buffer;
      

      使用预先分配的缓冲区从文件中读取并使用字符串进行进一步复制可能很方便。

      enum {MaxLineLength = 128};
      char buffer[MaxLineLength];
      
      string line[10];
      

      请注意,对于buffer,程序在实际读取之前无法知道实际长度,因此需要长度上限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多