【问题标题】:Use scanf to return one string at a time, separated by specific char使用 scanf 一次返回一个字符串,以特定字符分隔
【发布时间】:2013-07-24 12:29:31
【问题描述】:

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

【问题讨论】:

  • scanf() 是邪恶的,不要使用它,将它用于标记化是一个特别糟糕的主意。 strchr()、strstr() 和 strtok_r() 都是更好的选择。
  • scanf() 没有任何问题。请提供一个代码示例,表明使用 scanf() 的合理尝试,我将帮助您使其工作。

标签: c scanf


【解决方案1】:

查看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!!
}

【讨论】:

  • 谢谢..我知道它不会修改它,我只是认为 %*c 将在制表符之后开始下一次调用 sscanf
  • 不,它不会影响下一次调用 - 如果它是一个 scanf 它可能会这样做......因为你正在消费用户输入,但一个字符串每次都是相同的。跨度>
【解决方案2】:

示例代码:

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多