【问题标题】:C - read text into char array and print issueC - 将文本读入字符数组并打印问题
【发布时间】:2013-12-22 23:23:42
【问题描述】:

我正在读取文本文件 (.txt) 并获取其中的值。

这是我的代码:

// Definitions.
FILE* file;
date t1, calc[99999];
int index = 0, counter = 0, i;
char info[100];
char *newInfo[9999];

while(!feof(file)){
                fscanf(file, "%s %d %d %d\n", info, &t1.day, &t1.month, &t1.year);
                newInfo[index] = info;
                calc[index].day = t1.day;
                calc[index].month = t1.month;
                calc[index].year = t1.year;
                printf("read: %s %d %d %d\n", info, t1.day, t1.month, t1.year);
                index++;
                counter++;
        }

结果是:

line_1 01 01 2011
line_2 02 02 2012
line_3 03 03 2013

到目前为止还可以,但是当我尝试在 while 循环之外打印它们时,它总是打印最后一个值,即 line_3

for(i = 0; i < counter; i++)
printf("%s %d %d %d\n", newInfo[i], calc[i].day, calc[i].month, calc[i].year);

结果是:

line_3 01 01 2011
line_3 02 02 2012
line_3 03 03 2013

它应该像我预期的那样打印结果(我在上面展示过)。

我在newInfo[index] = info; 行赋值并增加index 变量。但它仍然只显示最新的文本。

任何帮助将不胜感激。

【问题讨论】:

  • 之前已多次询问过此问题的重复问题。与以往一样,困难在于确定它是重复的问题。
  • @JonathanLeffler 智者曾感叹,"What has been will be again, what has been done will be done again; there is nothing new under the sun."
  • @JonathanLeffler,语言标签中的高比例问题涉及相同的 15 或 20 个问题,例如循环中的 eof、对只读字符串的操作、未分配的 ptrs 空间等。如果有一种机制可以将这些问题抽象到它们自己的子标签下,那将是很好的,甚至可能是一个可观的价值。这将通过不标记重复项来减少重复项的问题。它们只是子标签语料库中的示例。我们的目标不是将它们剔除,而是对它们进行适当的分类。
  • @Duck:总的来说,这是个好主意,但实现起来并不那么容易。一个问题是确定合适的标签名称。另一个是找到要贴上标签的问题;另一个是选择规范的问答。我已经开始收集一些我认为是一些问题的规范问答示例(例如while (!feof(fp)))。但是我并没有竭尽全力创建好的标签和标签问题,这是一个问题。 (这个特定问题很少是代码的唯一问题;它通常只是众多问题中的一个额外问题。)
  • @JonathanLeffler,我完全同意多个问题的问题令人烦恼。对于子标签类别,我建议创作仅限于在语言标签中获得徽章的人并由他们投票。据推测,这既赋予了标签领域一定程度的能力,又赋予了对所提出问题类别的持续熟悉。例如,我很惊讶人们能够如此容易(和准确地)认识到 XY 问题。如果子标签保持在一个可管理的范围内,我认为同样的识别会起作用。无论如何,可能是元讨论!

标签: c dev-c++


【解决方案1】:

newinfo 是一个 ptr 数组。这些指针中的每一个都设置为指向infoinfo 将保存最后读取的内容,因此newinfo 中的每个指针都将指向最后读取的内容。

【讨论】:

    【解决方案2】:

    C 中的字符串不是一等对象——它们只是数组的一种特殊情况,而数组本身只是指针的一种特殊情况。这样做的后果之一是诸如赋值之类的操作不会像您期望的那样工作。线

    newInfo[index] = info;
    

    不是复制字符串“info”,而是复制底层指针。为了复制一个字符串,你需要使用“strcpy()”(如果你已经为字符串分配了空间),或者如果你没有使用“strdup()”(然后你需要记住释放分配的内存)。在您的代码中,您可以将上面的行替换为

    newInfo[index] = strdup(info);
    

    【讨论】:

      【解决方案3】:

      好吧,你每次都将信息保存到同一个数组中,将info表示的指针(数组的开头)复制到NewInfo[index],这没有帮助。

      您必须为要进入的字符串分配空间,并将其分配给NewInfo[index]。最简单的,如果你的系统有它,是:

      NewInfo[index] = strdup(info);
      

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 2011-08-18
        • 2020-07-08
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2021-02-08
        相关资源
        最近更新 更多