c - 使用 fscanf 从文件中读取字符串后读取整数

标签 c string format scanf format-specifiers

我制作了一个包含以下内容的 test.txt 文件的程序

24 Rohit Soni 1997

这是我的代码:

#include <stdio.h>

void main()
{
    FILE *f;
    int no,i;
    char *name;
    f=fopen("test.txt","r");
    fscanf(f,"%d %[^[0-9]]s %d ",&no, name, &i);
    printf("%d %s %d",no, name,i);
    fclose(f);
}

但它没有显示正确的输出。 输出是:

24 Rohit Soni 12804

请告诉我该怎么做。为什么在使用 %[ 格式说明符从 fscanf 获取字符串后不接受整数。

最佳答案

您应该测试 fscanf() 的返回码;它会告诉您转换了 2 个值,而不是您期望的 3 个值。您应该始终测试 fscanf() 的返回码,通常是针对预期的转换次数,很少会测试 EOF 或 0。

问题是扫描集 %[^…] 不是 %s 的修饰符,而且扫描集在第一个 处停止] 除非紧随 [ 用于常规扫描集或 [^ 用于否定扫描集。因此,您的格式字符串正在寻找一系列“不是数字也不是 [”字符,后跟 ]s —它没有在输入中找到 ]s

你需要:

#include <stdio.h>

int main(void)
{
    const char *filename = "test.txt";
    FILE *f = fopen(filename, "r");
    if (f == 0)
    {
        fprintf(stderr, "Failed to open '%s' for reading\n", filename);
        return 1;
    }
    int no,i;
    char name[128];

    if (fscanf(f, "%d %127[^0-9] %d", &no, name, &i) != 3)
    {
        fprintf(stderr, "Failed to read three values\n");
        return 1;
    }
    printf("%d [%s] %d\n", no, name, i);
    fclose(f);
    return 0;
}

您需要检查 fopen() 是否有效。错误消息应包括您无法打开的文件名。 (如果您注意命令行参数 — 使用 int main(int argc, char **argv) — 您会在 argv[0] 中报告程序名称也有错误消息。)您需要为 name 分配空间,而不是使用未初始化的指针。 correct return type for main()int — 尽管 Microsoft 确实允许 void。请注意,输入格式确保没有 buffer overflow .

我在输出中将名称包含在 […] 中,因此您可以看到该名称包含尾随空格。我得到的输出是:

24 [Rohit Soni ] 1997

关于c - 使用 fscanf 从文件中读取字符串后读取整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203717/

相关文章:

iphone - 如何存储/检索对象的 NSMutableArray?

c++ - 在 char 数组中查找最多 6 个连续 0 位的最快方法

c++ - 如何将文本附加到 Windows 中的文件?

c++ - 在 C++ 中怎么可能有一个字符串数组?

java - 如何将数字 .00 格式化为 0.00?

Excel:如何在日期格式的单元格上使用 LEFT 函数?

c - 如何在 ubuntu 11.10 的 eclipse IDE 中编程和编译 C?我需要安装哪个插件?

string - slice 显示在带有行和列的列表中

regex - 在 Notepad++ 中从逗号或点字符后的文本字符串中获取特定子字符串

带有格式化文本的 c# Treeview 节点,例如制表符和新行