#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
char ch;
char s[100];
char sen[100];
scanf("%c", &ch);
scanf("%s", s);
scanf("%[^\n]%*c", sen);
printf("%c\n", ch);
printf("%s\n", s);
printf("%s\n", sen);
return 0;
}
//输入
- C
- 简体中文
- 欢迎来到C!!
我没有得到最后一个printf的输出。这里有什么问题吗?
1条答案
按热度按时间jxct1oxe1#
输入为
一米零一米零一米零一米零一米零一米零一米零一米零一米零二米零一米零。
scanf("%c", &ch);
读取"C"
。"\nLanguage\nWelcome To C!!\n"
保留。"%c"
读取/保存1个字符。scanf("%s", s);
读取"\nLanguage"
。"\nWelcome To C!!\n"
保留。"%s"
读取/丢弃前导空格并读取/保存无限的非空格字符,然后将 *null字符 * 附加到s
。scanf("%[^\n]%*c", sen);
读取 nothing."\nWelcome To C!!\n"
保留。"%[^\n]%*c"
立即停止,因为第一个可用字符是'\n'
,并且不在扫描集中[^\n]
。sen
不变。最后printf有什么问题
printf("%s\n", sen);
尝试从未分配的sen
数组打印,导致 undefined behavior(UB)。这里会有什么问题呢?
scanf()
的返回值有3处检查失败有了
if (scanf("%[^\n]%*c", sen) != 1) puts("Error");
,它会变得很清楚,什么都没有读.使用
"%s"
和"%[^\n]"
不带宽度scanf("%s", s);
有输入溢出的风险。使用类似scanf("%99s", s);
的宽度和char s[100];
还可以更改代码以使用前导空格。
更好的是,停止使用
scanf()
,而使用fgets()
来处理所有用户输入。