我正在尝试将字符串排序为C中的不同变量(当我说字符串我的意思是char数组时)。该字符串包含较小的“块”,由制表符分隔,我希望sscanf在每次调用时将下一个“块”放入字符串中。
例如,如果字符串是00:00:00:00 12345 abcd
,我希望第一个sscanf调用将00:00:00:00
放入字符串中,下一个sscanf调用将12345
放入字符串中,等等。
我无法理解为什么我的代码不起作用。我有sscanf(s, "%[^\t]%*c", buf)
,它(我认为)应该告诉sscanf读取所有内容到制表符,然后%*c
告诉它读取但丢弃制表符(以便下次sscanf是叫,没有前导标签字符)。字符串中的块之间不会有超过1个制表符。
我确信有更好的方法可以做到这一点,而不是使用sscanf,如果有人告诉我,这会很棒,但我也想知道这一点,因为它似乎很烦人,我不知道为什么它不起作用。谢谢你的帮助
答案 0 :(得分:3)
请查看strtok以便更轻松地拆分它。
另请注意,您的sscanf调用不会修改字符串,只是从中提取(即在第二次调用时,您不能先将s
传递回它而不先修改它。)使用sscanf执行此操作像这样的事情会这样做:
while (/* do your own check on str here*/)
{
// Scan the next part
sscanf(str, "%[^\t]%s", firstBit, remain);
// Copy it back and do it again
strcpy(str, remain); // Being careful here not to sscanf into the source string!!
}
答案 1 :(得分:1)
示例代码:
#include <stdio.h>
int main(){
char s[] = "00:00:00:00\t12345\tabcd";
char buf[32];
int pos = 0, read_len;
//%n : reading character count into read_len address
//pos : next read position
while(1==sscanf(s + pos, "%[^\t]%n%*c", buf, &read_len)){
printf("%s\n", buf);
pos += read_len + 1;
if(s[pos] == '\0') break;
}
return 0;
}