1

我正在尝试将字符串排序为 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 更好的方法,如果有人告诉我,那就太好了,但我也想弄清楚这一点,因为它似乎很容易烦人而且我没有知道为什么它不起作用。谢谢你的帮助

4

2 回答 2

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!!
}
于 2013-07-24T12:33:44.870 回答
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;
}
于 2013-07-24T13:25:36.170 回答