如何从带有分隔符的文本文件中扫描字符串然后显示它?

How to scan strings from a text file with delimiter and then display it?

所以我尝试制作一个程序,该程序将从文本文件中扫描字符串,然后使用循环显示它。但是,不知何故,我的程序无法运行,并且显示奇怪的符号。我是文本文件的新手,如果有人能向我解释我的代码有什么问题,我将不胜感激。

我的代码:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fPtr;
    fPtr = fopen("alumni.txt", "r");
    if (fPtr == NULL) {
        printf("There is a error opening the file.");
        exit(-1);
    }
   
    char name[20], design[50], category[20], location[20];
    
    while (fscanf(fPtr, "%s:%[^\n]:%[^\n]:%[^\n]", &name, &design, &category, &location) != EOF) {
        printf("Name : %s\n", name);
        printf("Designation : %s\n", design);
        printf("Category : %s\n", category);
        printf("Location : %s\n", location);
    }
}

这是我的文本文件,

Shanie:Programmer:Full Time:Kuala Lumpur
Andy:Sales Agent:Part Time:Johor Bahru
Elaine:Database Administrator Full Time Melaka
Stephanie:MIS manager:Full Time:Penang

您有 两个 问题:第一个是 %s 将读取 space 分隔的“单词” , 它不会停在 :。第二个问题是格式 %[^\n] 读取 all until newline.

所以你需要第一个 name 的扫描集格式,并告诉它读取到下一个 :,这是用 %[^:].[=32 格式完成的=]

所以请改为:

while (fscanf(fPtr, " %19[^:]:%49[^:]:%19[^:]:%19[^\n]", name, design, category, location) == 4) {
    ...
}

请注意我对您的调用和循环条件所做的一些其他更改:首先,我在格式中添加了长度说明符,因此 fscanf 不会超出您的数组范围。

其次,%s%[] 格式都需要一个 char * 参数,而您提供了一个指向数组的指针(&name 将是 char (*)[20] 而不是 char *)。数组自然 衰减 指向指向其第一个元素的指针,例如name 将衰减为 &name[0],这将是正确的类型 char *

第三,我将比较更改为与 4 进行比较,如果成功解析输入,fscanfreturn 进行比较。

最后,我在第一种格式之前添加了一个 space,以跳过任何前导 space(就像上一行的换行符)。


为了确保即使在输入格式错误的情况下也能继续,我建议您改为阅读整行(使用例如 fgets),然后可能使用 sscanf 来解析每个线.