我想從字符串中提取2子:提取從線二子可預測的格式
char test[] = "today=Monday;tomorrow=Tuesday";
char test1[20];
char test2[20];
sscanf(test, "today=%s;tomorrow=%s", test1, test2);
當我今天打印出來,我得到週一也是字符串的其餘部分。我想test1是星期一,我希望test2是星期二。我如何正確使用sscanf?
我想從字符串中提取2子:提取從線二子可預測的格式
char test[] = "today=Monday;tomorrow=Tuesday";
char test1[20];
char test2[20];
sscanf(test, "today=%s;tomorrow=%s", test1, test2);
當我今天打印出來,我得到週一也是字符串的其餘部分。我想test1是星期一,我希望test2是星期二。我如何正確使用sscanf?
當使用%s個標籤,sscanf的讀取,直到下一個空格被發現,根據該文件:http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
因此,例如,您可以將您的字符串改變
char test[] = "today=Monday tomorrow=Tuesday";
的關鍵是告訴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
編輯:
#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;
}
結果:
您可以將此替代使用strtok
找到有用
嗯,如果我不能修改原始測試字符串,我該怎麼辦? – egidra 2012-03-12 03:52:10
如果您無法修改原始字符串,請嘗試使用while循環的組合。在測試中循環字符,直到遇到一個=。然後開始保存字符到test1,直到遇到a;。對於test2重複類似。 – mkasberg 2012-03-12 03:55:24
像這樣:'int i = 0; while(test [i]!='='){i ++}; int j = 0; while(test [i]!=';'){test1 [j] = test [i];我++; j ++}' – mkasberg 2012-03-12 03:58:19