使用scanf一次返回一个字符串,由特定的char分隔

时间:2013-07-24 12:29:31

标签: c scanf

我正在尝试将字符串排序为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,如果有人告诉我,这会很棒,但我也想知道这一点,因为它似乎很烦人,我不知道为什么它不起作用。谢谢你的帮助

2 个答案:

答案 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;
}