【问题标题】:Strings not being read correctly from file using fscanf使用 fscanf 从文件中未正确读取字符串
【发布时间】:2023-03-17 08:50:01
【问题描述】:

我正在使用fscanf 接受特定格式的输入。我要阅读的行是:

A B C D E F G H I J K x

我的fscanf 代码如下:

fscanf(circuit, "%s %s %s %s %s %s %s %s %s %s %s %c ",
       str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, &a);

在本例中,“电路”是文件的名称。出于某种原因,"K" 和 'x' 被正确读取(分别为 str11 和 a),但其余字符无法正确读取。我选择字符串标识符而不是字符标识符的原因是因为该行可能包含单个数字整数。在整数的情况下,我只是在稍后的代码块中将字符串转换为整数。为什么这不能正常工作?

【问题讨论】:

  • 你能把所有 %s 之间的空格去掉再试一次吗?
  • 是str1, str2等都指向同一个缓冲区吗?
  • 问题好像是char数组,试试str1[2]
  • 如果不查看程序的其余部分,很难说出问题所在。请发帖Minimal, Complete, and Verifiable example。
  • 你真的,真的需要显示字符串的定义。例如,如果你有char str1[1]; 等,你会遇到问题。格式字符串中的尾随空格很危险。它将读取所有空格(空格、制表符、换行符——尤其是换行符!)直到下一个非空格字符(将留在输入中以供进一步处理)或 EOF。如果此数据来自文件,通常情况下还不错。如果数据来自终端,这将非常糟糕。如果输入来自管道或套接字,它也经常造成严重破坏。

标签: c input scanf


【解决方案1】:

我的机器上有这段代码。

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

//#define _CRT_SECURE_NO_WARNINGS

int main()
{
    char str1[2], str2[2], str3[2], str4[2], str5[2], str6[2], str7[2], str8[2], str9[2], str10[2], str11[2];
    char a;
    FILE * fp;
    fp = fopen("test.txt", "w+");
    fputs("A B C D E F G H I J K x", fp);

    rewind(fp);
    fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s %c ", str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, &a);

    printf("Read String1 |%s|\n", str1);
    printf("Read String2 |%s|\n", str2);
    printf("Read String3 |%s|\n", str3);
    printf("Read Character |%c|\n", a);

    fclose(fp);

    return(0);
}

输出:

Read String1 |A|
Read String2 |B|
Read String3 |C|
Read Character |x|

【讨论】:

  • 这很可能与实际问题无关。 OP 没有提供上下文,您只是对正确的实现进行了疯狂的猜测。也没有令人满意的解释。
  • 欢迎来到 Stack Overflow,Confiz-3C。当您要发布代码或程序输出时,请在文本编辑框中按您希望的方式对其进行布局。避免制表符;通常使用 4 个缩进空格,尽管数量并不重要。然后选择所有代码并使用编辑框上方的 {} 按钮将其缩进,就像 sebastianbrosch 为您所做的那样。这使它看起来像代码。
  • 请注意,最好在使用 fp 之前测试 fopen() 是否成功。检查 fscanf() 是否返回正确的值 (12) 也是一个好习惯;如果不是这样,那就是出了严重的问题。尤其是char str1[2];,最好用%1s 保护代码不溢出。这些都是可以改进代码的改进。我认为您已经对问题中的代码应该是什么样子做出了合理的推断——但是因为我们只有 fscanf() 语句而没有其他语句,所以这只是推断。它可能对萨拉有帮助;它可能不会。
  • 另请参阅我的comment,了解格式字符串中的尾随空格——这是个坏消息,应该避免。
猜你喜欢
  • 2017-05-03
  • 2014-02-10
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
相关资源
最近更新 更多