【发布时间】:2018-02-17 19:09:01
【问题描述】:
当我使用线条时:
char *sentence = (char *)malloc(100);
scanf("%[^\n]%*c",sentence);
从标准输入读取一行到缓冲区,句子,然后有:
printf("%s\n", sentence);
之后,我注意到 printf 打印了整个句子,而不是只打印该行的第一个单词。为什么是这样? printf 不应该只占用第一个空格吗?如果不是,它怎么知道在哪里停下来?句子肯定不会以“\n”结尾,因为它不读取最后一个返回值,我们使用 *c 读取一个字符而不是存储它。
【问题讨论】:
-
1. malloc 的演员阵容不好stackoverflow.com/questions/605845/…
-
2.也许阅读 scanf 的手册页linux.die.net/man/3/scanf
-
'printf()' 中的 '%s' 将输出到一个 NUL 字节。它不会停留在“空白”处
-
在调用任何
scanf()系列函数时: 1) 始终检查返回值(而不是参数值)以确保操作成功。 2) 当使用输入/格式说明符%[...]和/或%s时,始终包含一个比输入缓冲区长度小1 的MAX CHARACTERS 修饰符,因此输入缓冲区不会溢出(注意:这两个输入/格式说明符总是将 NUL 字节附加到输入。)如果传入的字符溢出输入缓冲区,结果是未定义的行为,并可能导致段错误事件。 -
在调用任何堆分配函数(malloc、calloc、realloc)时 1) 始终检查 (!=NULL) 返回值以确保操作成功