通过printf函数在C中处理%s

时间:2018-02-17 19:09:01

标签: c printf buffer scanf

当我使用这些行时:

char *sentence = (char *)malloc(100);
scanf("%[^\n]%*c",sentence);

从stdin读取一行到缓冲区,句子,但后来有:

printf("%s\n", sentence);

之后,我注意到printf打印的是整个句子,而不是该行中的第一个单词。为什么是这样?打印不应该只占用第一个空格吗?如果没有,它怎么知道停在哪里?句子肯定不会以" \ n"因为它没有读取最后一个回报,我们使用* c来读取一个字符而不是存储它。

1 个答案:

答案 0 :(得分:4)

扫描集不包含' ',因此它在获取时不会停止。 scanf将是

scanf("%[^ \n]%*c",sentence);

当它找到\n' '时,这基本上会停止。这样,如果它是空格分隔的话,你会得到第一个单词。(虽然如果第一个单词之前有空格,那么句子会没有更新,因为scanf看到来自scanset的字符)请注意,缓冲区可以容纳100个字符(由char* sentence指向),所以请像这样使用

scanf("%99[^ \n]%*c",sentence);

比它能容纳的少一个,因为还有nul终止字符。

此外,如果你想得到一个单词,你可以做一些更简单的事情:-(这个解决方案可以在一个单词前缀为空格的场景中工作,因为%s格式说明符会跳过它们并存储非空格直到遇到白色空格的charcaters或者扫描长度指定的最大charcaters)

scanf("%99s",sentence);