1

我是 C 新手,我看到很多一次读取一个单词的文件的示例,但我正在尝试创建一个函数,该函数给出一行文本(实际上是文件名列表),它需要读取一个一次单词(文件名)。

例如。我调用函数 words("file1.c file2.c file3.txt");

该函数需要读取每个单词(文件名)并将其传递给另一个函数。

到目前为止,我有:

void words(char* line) {

    char buf[100];

    while (!feof(line)) {
        fscanf(line,"%s",buf);

        printf("current word %s \n", buf);  
    }
}

但这不会编译。我得到“从不兼容的指针类型传递'feof'的参数1”

编辑所以这是我想出的代码。如果我用 words("test1 test2 test3 test4 "); 调用它,它似乎工作正常。但如果最后一个字符不是空格,则输出中有错误。例如(“test1 test2 test3 test4”);

char buf[100];
int word_length = 0;
int n;

while((sscanf(line + word_length,"%s",buf, &n)) == 1) {
    printf("current word %s \n", buf);  
    word_length = word_length + strlen(buf) + 1;
}

我做错了什么?

4

1 回答 1

2

fscanf函数feof适用于文件。

字符串对应的函数是sscanf.

from 的返回值sscanf可用于检查您是否设法扫描了字符串中的任何内容,以及您应该在字符串中查找下一个单词的距离。

编辑:

好功夫。剩下两个问题。首先,如果单词之间有多个空格,您的代码将失败。此外,+ 1如果最后一个单词后没有空格,则会将您移过空终止符。

第二个问题可以通过不添加+1来解决。这意味着将在前一个项目结束后立即扫描下一个项目。这不是问题,因为scanf会跳过初始空格。

多个空格的问题可以通过找出下一个标记开始使用的字符串有多远来解决strstr

因为strstr返回一个指针,所以我切换到使用指针而不是索引来跟踪字符串的进度。

char *ptr = line;

while((sscanf(ptr,"%s",buf)) == 1) {
    printf("current word %s \n", buf);
    ptr = strstr(ptr, buf);  // Find where the current word starts.
    ptr += strlen(buf); // Skip past the current word.
}
于 2013-10-08T08:13:04.510 回答