#include <stdio.h>
#define PRAISE "you are an extraordinary being. "//c预处理器定义字符串常量
int main()
{
char name[40]; //[]表示数组,此处name是一个可容纳40个字符的数组
printf("what's your name?");
scanf("%s",name); //用%s处理字符串的输入和输出
printf("%s,%s\n",name,PRAISE); //用%s处理字符串的输入和输出
getchar();
getchar();
return 0;
}
程序运行时发现一个问题:如果输入的名字为一个连在一起的字符串(zhao),则不会出现问题,程序正常;但是若输入为含有空格的字符串(zhao guangyuan),则输入该字符串后,并不会继续打印下一行printf("%s,%s\n",name,PRAISE);
那么是什么原因呢?
下面是一个相同的例子:
//sizeof()以字节为单位给出对象的大小,strlen()给出字符串中的字符长度
#include <stdio.h>
#include <string.h>
#define PRAISE "you are an extraordinary being. "
int main(void)
{
char name[40];
printf("what's your name?");
scanf("%s",name);
fflush(stdin); //C语言清空输入缓冲区函数
printf("hello.%s,%s\n",name,PRAISE);
printf("your name of %u letters occupies %u memory cells.\n",strlen(name),sizeof name );
printf("the phrase of parise has %u letters,",strlen(PRAISE));
printf("and occupies %u memory cells",sizeof PRAISE );
getchar();
return 0;
}
通过加上清空缓冲区函数fflush(stdin);,即可正常显示,结果如下:
(scanf()只读取字符串中的一个单词,而不是一整句)
解决办法:(二办法任选其一)
1。清空输入缓冲区:原来scanf是从标准输入缓冲区中读取输入的数据,而%s(或者%c%d等等)的字符输入格式会接收回车字符,在输入第一个scanf时输入字符后按回车结束,输入缓冲中保存了这个回车符,遇到printf时直接给了printf,所以下一行的printf不能正常打印
第一个scanf后加入语句:fflush(stdin); //C语言清空输入缓冲区函数
2。格式控制中加入空格
将第二个scanf改为:scanf(" %c",&ch2);//在%号前面加一个空格
此外,在使用getchar()输入字符的时候也会出现上述情况,此时除了可以用上述中方法一解决之外,对应的方法二可以可以改为:写两个getchar();
sizeof()以字节为单位给出对象的大小,strlen()给出字符串中的字符长度