本文介绍了使用正确的sscanf的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应该得到的输入线,可以​​是在任意的以下格式:


  • 必须有字1和字2之间的空间。

  • 必须有字2和字3之间的逗号。

  • 空格不是字2字3间一绝 - 但任意数量的空格可以

我怎么能分开1,2和3个字的情况下,把数据放到正确的变量?

 字1
字词1 WORD2
字词1 WORD2,WORD3
字词1 WORD2,WORD3

我想过是这样的:

 的sscanf(串,%s%S%S,字词1,word2和WORD3);

但它似乎并没有工作。

我使用严格C89。


解决方案

  INT N =的sscanf(串,%s%[^,]%* [,]%S 字词1,word2和WORD3);

的返回值n 告诉你很多任务是如何成功地进行。在%[^,] 是一个否定的字符类匹配的发现一个字不包括逗号或空格(添加标签,如果你喜欢)。在%* [,] 是一个比赛是找到一个逗号或空间,但燮presses分配。

我不知道我会在实践中使用,但它应该工作。然而,这是,未经考验的。


也许更严格的规范是:

  INT N =的sscanf(串,%s%[^,]%* [,]%S,字词1,word2和WORD3);

不同的是,在非分配字符类只接受一个逗号。在字词2 的sscanf()停止在任何空间(EOS,字符串结尾或),分配给前跳过空格 WORD3 。的previous版允许第二和第三字之间的空间,以代替一个逗号,该问题并不严格容许的

由于表明在注释中,分配转换规范应给予长度,以prevent缓冲区溢出。注意,该长度不包括空终止,因此在格式字符串的值必须是小于以字节数组的大小。另外请注意,而的printf()允许您使用 * sscanf的动态指定大小( )等使用 * 共进晚餐preSS分配。这意味着你要专门创建的字符串手头的任务:

 字符字1 [20],WORD2 [32],WORD3 [64];
INT N =的sscanf(串,%19秒%31 [^]%* [,]%63S,字词1,word2和WORD3);

(Kernighan的&安培;派克认为他们(优秀)的书的'实践。)


Yes, there's a cure, and it is actually trivial, too. Add a space in the format string before the non-assigning, comma-matching conversion specification. Thus:

#include <stdio.h>

static void tester(const char *data)
{
    char word1[20], word2[32], word3[64];
    int n = sscanf(data, "%19s %31[^, ] %*[,]%63s", word1, word2, word3);
    printf("Test data: <<%s>>\n", data);
    printf("n = %d; w1 = <<%s>>, w2 = <<%s>>, w3 = <<%s>>\n", n, word1, word2, word3);
}

int main(void)
{
    const char *data[] =
    {
        "word1 word2 , word3",
        "word1 word2 ,word3",
        "word1 word2, word3",
        "word1 word2,word3",
        "word1 word2       ,       word3",
    };
    enum { DATA_SIZE = sizeof(data)/sizeof(data[0]) };
    size_t i;
    for (i = 0; i < DATA_SIZE; i++)
        tester(data[i]);
    return(0);
}

Example output:

Test data: <<word1 word2 , word3>>
n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
Test data: <<word1 word2 ,word3>>
n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
Test data: <<word1 word2, word3>>
n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
Test data: <<word1 word2,word3>>
n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>
Test data: <<word1 word2       ,       word3>>
n = 3; w1 = <<word1>>, w2 = <<word2>>, w3 = <<word3>>


Once the 'non-assigning character class' only accepts a comma, you can abbreviate that to a literal comma in the format string:

int n = sscanf(data, "%19s %31[^, ] , %63s", word1, word2, word3);

Plugging that into the test harness produces the same result as before. Note that all code benefits from review; it can often (essentially always) be improved even after it is working.

这篇关于使用正确的sscanf的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 19:39