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

时间:2015-01-08 01:22:17

标签: c string

我必须从文件中读取多个字符串,看起来像这样

string1 string2 string3
string4 string5 string6
string7 string8 string9

我曾尝试使用scanf("%s %s %s",&str1,&str2,&str3);,但它以奇怪的方式读取字符串。请不要开始侮辱或任何事情,因为我没有被教导如何做到这一点并且得到或者似乎没有工作对我来说。

2 个答案:

答案 0 :(得分:1)

在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;
}

答案 1 :(得分:1)

我有一个文本文件:

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 *,aka流用于C中的输入/输出.scanf()使用默认输入流(stdin),因此不能用于读取文件。 fscanf()允许您将文件流指定为参数。

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

if(fileReader)检查fileReader是否成功打开(非零值= true,0(aka NULL)= false)。我本可以这样做(fileReader!= NULL),但效果相同。

另外,你不要使用&amp;处理数组时的运算符。 当传递给函数(如scanf())时,数组会变成指针,所以通过使用&amp ;,你传递scanf()指针的地址,这不是你想要的。

这是我编译上面代码时得到的结果(使用的文本文件保存为“text.txt”):

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