【问题标题】:fscanf() function puts a \000 at the first char readfscanf() 函数在读取的第一个字符处放置一个 \000
【发布时间】:2019-05-27 23:02:48
【问题描述】:

我正在尝试读取这种格式的文件:

05874121 A 7
07894544 C 3
05655454 B 5
05879544 B 6
05763465 C 2

并将每个“单词”分配给不同的变量(dni、模型、垃圾)

这段代码在 Linux 上运行,我使用 CLion 进行调试。

char *path = "file.txt";
FILE *f;
int result;
char dni[9], model[1], trash[100];

f = fopen(path, "r");
do {
    result = fscanf(f, "%s %s %s", dni, model, trash);
    printf("DNI: %s\n", dni);
}
while( result > 0);

fclose(f);

这应该打印第一列的值,但是当我执行程序时,输出只是: “DNI:” “DNI:” “DNI:” ...等等。

在调试时,我意识到“dni”正确存储了所有数字(作为字符),但第一个元素 dni[0] 始终是:0 '/000' 就像它是字符串的结尾一样。

我不知道为什么会这样。

【问题讨论】:

  • \0 结尾且值为"C" 的字符串包含多少字节?
  • 您需要为每个字符串中的终止 '\0' 字符分配空间。在model 的情况下,您分配了一个字符,这意味着您只能安全地存储一个长度为零的字符串加上空终止符。所以你有一个内存损坏问题。
  • null-terminated 字节字符串需要包含用于终止符的空间以及字符串数据本身应该已经被教导任何书籍、教程或课程。如果不是,那么您需要更换书籍、教程或不逃课。
  • 试试model[1] --> model[2]"%s %s %s" --> "%8s %1s %99s"

标签: c


【解决方案1】:

我在您的代码中做了 2 处更正:

#include <stdio.h>
int main (int argc, char ** argv) {
        char *path = "file.txt";
        FILE *f;
        int result;
        char dni[9], model[2], trash[100];

        f = fopen(path, "r");
        while(1) {
            result = fscanf(f, "%s %s %s", dni, model, trash);
            if (result < 1) break;
            printf("DNI: %s model %s trash %s\n", dni, model, trash);
        }

        fclose(f);
        return 0;
}

首先,变量model[2]必须有一个额外的字符作为字符串的结尾。

然后,“if (result

错误可能是模型[1] 只有一个字符。 dni 中的 \000 可以是模型字符串的结尾。

【讨论】:

  • 问题通过在模型变量中添加一个额外的字符来解决,谢谢!
猜你喜欢
  • 2016-01-18
  • 2022-11-30
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多