问题描述
我应该得到的输入线,可以是在任意的以下格式:
- 必须有字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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!