【问题标题】:Reading a line of chars one word at a time一次一个单词读取一行字符
【发布时间】:2013-10-08 07:59:49
【问题描述】:

我是 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”

edit 这就是我想出的代码。如果我用 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;
}

我做错了什么?

【问题讨论】:

    标签: c file-io


    【解决方案1】:

    fscanffeof 函数适用于文件。

    字符串对应的函数是sscanf

    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.
    }
    

    【讨论】:

    • 我已经使用 sscanf 重做了我的代码,它似乎适用于某些字符串,而不适用于其他字符串。任何的想法?我用新代码编辑了我的原始帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2012-04-08
    • 2013-06-27
    • 1970-01-01
    • 2016-01-18
    • 2014-04-14
    相关资源
    最近更新 更多