如何读取文件同一行的多个字符串?

How to read multiple strings on the same row of a file?

我是 C 的新手,正在尝试学习字符串、I/O 和文件。 我正在尝试从每行有多个字符串的文件中读取字符串,如下所示:

str1 str2 str3
str4 str5 str6
str7 str8 str9

到目前为止,我已经尝试过:

scanf("%s %s %s", &str1, &str2, &str3);

但它以一种奇怪的方式读取字符串。为什么 scanf 函数不起作用?我还看到另一种方法是使用 fgets 读取缓冲区中的整行,但我对我的缓冲区管理技能不是很有信心,所以有什么方法可以使用 scanf ?

在 C 中读取行的最佳方法是先使用 fgets() 读取,然后您可以使用 sscanf()strtok() 解析行以获取单词。

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

int main(){
    char line[1024];
    char str1[1024], str2[1024], str3[1024];
    while (fgets(line, sizeof(line), stdin) != NULL){
        if (strlen(line) > 0 && line[strlen(line) - 1] != '\n') {
            // or line[0] instead of strlen(line) > 0
            // like chux suggested (line[0] is more efficient)
            puts("The line is longer than expected");
            return 1;
        }
        if (sscanf(line, "%s %s %s", str1, str2, str3) != 3){
            // notice it wont fail if the input have more than 3 columns
            puts("Error parsing, not enough columns");
            return 2;
        }
    }
    return EXIT_SUCCESS;
}

我有一个文本文件:

ho hello blah hi dsdf hihi hiho hih bleh

以下是我用来阅读它的代码。

#include <stdio.h>

int main()
{
    char string1[11];   
    char string2[11];
    char string3[11];
    char string4[11];
    char string5[11];
    char string6[11];
    char string7[11];
    char string8[11];
    char string9[11];

    FILE * fileReader = fopen("text.txt", "r"); 
    if(fileReader)
    {
        fscanf(fileReader, "%10s %10s %10s %10s %10s %10s %10s %10s %10s", string1, string2, string3, string4, string5, string6, string7, string8, string9);
        printf("Found: %s %s %s %s %s %s %s %s %s\n", string1, string2, string3, string4, string5, string6, string7, string8, string9);
        fclose(fileReader);
    }
    else
    {
        puts("Error opening filestream!");
    }
 return 0;
}

FILE *,又名流用于 C 中的 input/output。scanf() 使用默认输入流 (stdin),因此不能用于读取文件。 fscanf() 允许您将文件流指定为参数。

此外,使用 %10s 可防止 fscanf() 为每个字符串读取超过 10 个字符。如果没有 %10s,scanf() 可能会导致您的程序出现缓冲区溢出。这基本上是当它读取的数据多于 char [] 变量可以容纳的数据时,破坏了程序内存。

if(fileReader) 检查 fileReader 是否已成功打开(非零值 = true,0(又名 NULL)= false)。我本可以像 if(fileReader != NULL) 那样做,但效果是一样的。

此外,您在处理数组时不使用 & 运算符。 数组在传递给函数时退化为指针,例如 scanf(),因此通过使用 &,您传递给 scanf() 的是指针的地址,这不是您想要的。

以上代码编译时得到的结果(使用的文本文件另存为"text.txt"):

sky@sky-Lenovo-3000-N500:~$ gcc stringReader.c -o string && ./string
Found: ho hello blah hi dsdf hihi hiho hih bleh