当我使用线条时:
char *sentence = (char *)malloc(100);
scanf("%[^\n]%*c",sentence);
从标准输入读取一行到缓冲区,句子,然后有:
printf("%s\n", sentence);
之后,我注意到 printf 打印了整个句子,而不是仅打印该行的第一个单词。为什么是这样? printf 不应该只占用第一个空格吗?如果不是,它怎么知道在哪里停下来?句子肯定不会以 "\n"结尾,因为它不会读取最后一个返回,我们使用 *c 读取一个字符而不存储它。
最佳答案
扫描集不包含 ' '
所以当它得到一个时它不会停止。 scanf
会是
scanf("%[^ \n]%*c",sentence);
当它找到 \n
时基本上会停止或 ' '
这样你会得到第一个单词,如果它是空格分隔的。(尽管如果第一个单词之前有空格,那么句子将不会更新,因为 scanf
从扫描集中看到一个字符)注意你的缓冲区可以容纳的一件事100 个字符(由 char*
sentence
指向)所以这样使用它
scanf("%99[^ \n]%*c",sentence);
比它能容纳的少一个,因为还有 nul 终止字符要容纳。
此外,如果你想得到一个单词,你可以像这样做一些更简单的事情:-(这个解决方案适用于单词以空格为前缀的场景,因为 %s
格式说明符会跳过它们并存储非-whitespace 直到遇到空白字符或扫描到长度指定的最大字符)
scanf("%99s",sentence);
关于c - 通过 C 中的 printf 函数处理 %s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48844935/