我正在尝试编写一个使用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不是强制性的,我对其他建议持开放态度。
答案 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
}
}