1

我正在尝试编写一个使用 fgets() 从文件中读取一行的函数。读完这条线后,我想把这条线拆开,做成更小的字符串。根据行中的第一个单词,我读入的行可以包含 3-5 个较小的字符串,这些字符串由空格分隔。

示例: 行:删除苹果 12345 字符串 1:删除字符串 2:苹果字符串 3:12345

行:加番茄红叶串1:加串2:番茄串3:红串4:叶

从上面的例子中,如果第一个字符串被删除,我需要读取另外 2 个字符串(苹果,12345)。如果添加第一个字符串,我需要读取 3 个其他字符串(番茄、红色、叶子)。

无论如何,我可以决定阅读次数并使用 sscanf 执行此操作吗?

while( fgets( buf, sizeof buf, course_file ) != NULL ){
    sscanf( buf, "%s", &string1);
    printf( "%s\n", buf );
} 

我使用 sscanf 不是强制性的,我愿意接受其他建议。

4

1 回答 1

2

通常用于标记字符串的函数是strtok,但它不是线程安全的;strtok_r应该改用它的现代版本。

在第一次调用中开始标记buf,检查第一个标记,然后进入依赖于第一个标记内容的几个循环之一:

while( fgets( buf, sizeof buf, course_file ) != NULL ) {
    char *saveptr;
    char *tok = strtok_r(buf, " ", &saveptr);
    if (!strcmp(tok, "delete")) {
        for (int i = 0 ; i != 3 ; i++) {
            tok = strtok_r(NULL, " ", &saveptr);
            // Do something with the token...
        }
    } else if (!strcmp(tok, "add")) {
        for (int i = 0 ; i != 4 ; i++) {
            tok = strtok_r(NULL, " ", &saveptr);
            // Do something else with the token...
        }
    } else {
        // Error
    }
}
于 2012-09-30T03:00:43.277 回答