扫描字符串以查找字符串

时间:2012-09-30 02:40:22

标签: c c-strings

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

实施例: 行:删除苹果12345 string1:删除 string2:apple string3:12345

线:加入番茄红叶 string1:add string2:番茄 string3:红色 string4:leaf

从上面的示例中,如果删除了第一个字符串,我需要读取另外两个字符串(apple,12345)。 如果第一个字符串是add,我需要读取其他3个字符串(番茄,红色,叶子)。

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

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

我使用sscanf不是强制性的,我对其他建议持开放态度。

1 个答案:

答案 0 :(得分: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
    }
}