我正在尝试从字符串中提取两个子字符串:
char test[] = "today=Monday;tomorrow=Tuesday";
char test1[20];
char test2[20];
sscanf(test, "today=%s;tomorrow=%s", test1, test2);
当我今天打印出来时,我会在星期一而且还有其余的字符串。我希望test1是星期一,我希望test2是星期二。我如何正确使用sscanf?
答案 0 :(得分:3)
关键是要告诉sscanf
停止的地方
在你的情况下,将在分号
如果你没有指定那么%s
说明直到下一个空格,就像@mkasberg提到的那样。
#include <stdio.h>
#include <string.h>
int main() {
char *teststr = "today=Monday;tomorrow=Tuesday";
char today[20];
char tomorrow[20];
sscanf(teststr, "today=%[^;];tomorrow=%s", today, tomorrow);
printf("%s\n", today);
printf("%s\n", tomorrow);
return 0;
}
产地:
Monday Tuesday
编辑:
您可以使用strtok
找到有用的替代方案:
#include <stdio.h>
#include <string.h>
int main () {
const char teststr[] = "today=Monday;tomorrow=Tuesday";
const char delims[] = ";=";
char *token, *cp;
char arr[4][20];
unsigned int counter = 0;
unsigned int i;
cp = strdup(teststr);
token = strtok(cp, delims);
strcpy(arr[0], token);
while (token != NULL) {
counter++;
token = strtok(NULL, delims);
if (token != NULL) {
strcpy(arr[counter], token);
}
}
for (i = 0; i < counter; i++) {
printf("arr[%d]: %s\n", i, arr[i]);
}
return 0;
}
结果:
arr[0]: today arr[1]: Monday arr[2]: tomorrow arr[3]: Tuesday
答案 1 :(得分:0)
使用%s标记时,根据此文档,sscanf会一直读取,直到找到下一个空格:http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
因此,例如,您可以将字符串更改为
char test[] = "today=Monday tomorrow=Tuesday";