c - 通过 C 中的 printf 函数处理 %s

标签 c printf buffer scanf

当我使用线条时:

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/

相关文章:

c - 指向结构成员的指针

haskell - 如何返回小数点后2位的 float ?

c - 在 C 语言中从文件中读取整数时遇到问题

c - C中的字符串搜索和格式化

java - 使用哪些缓冲区从 ServerSocket 创建的 Socket 接收输入流?

c++ - 字节缓冲区应该是有符号缓冲区还是无符号字符缓冲区?

c - 接收多个 TCP 段

c - 如何纠正从客户端读取数据的套接字编程错误?

c - 我需要从一个单词中获取字母

c - 简单的 C 数字格式