2012-09-30 168 views
1

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

实施例: 行:除去苹果12345 字符串1:除去 字符串2:苹果 STRING3:12345

行:加番茄红叶 字符串1:添加 字符串2:番茄 STRING3:红色 串,4:叶

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

反正是有,我可以决定的次数阅读并做到这一点使用sscanf的?

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

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

+0

我不清楚你的意思通过“决定阅读的次数”。 – CrazyCasta

+0

对不起。让我们来做一个精确的例子。如果第一个单词是删除,我需要创建3个令牌(删除,苹果,12345),如果第一个单词是添加,我需要创建4个令牌(添加,番茄,红色,叶)。 – rlhh

回答

1

常用来标记字符串的函数是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 
    } 
} 
+0

无论如何,我可以向前看,知道我是否真的读过所有参数/迷你弦?我很担心,因为我需要处理一个姓名字段,可以是名字,中间名和姓氏的任意组合。 – rlhh

+0

@ user1043625您可以根据您看到的当前令牌使您的令牌化逻辑继续或停止。我的意思是,如果你找到一个特定的标记,或者当标记流尽早结束时,你可以使用'while'来代替'for'循环,或者跳出循环。 – dasblinkenlight

+0

嗯,没关系。想知道是否有方法可以将指针提取到strtok_r的当前位置。 – rlhh