目录
1.字符
字符输入--scanf
字符输入--getchar
2.字符串
字符串输入--scanf
字符串输入--gets
1.字符
字符输入--scanf
C语言scanf输入时缓冲区问题
scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格(' ')、回车('\n')这类字符,当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。
#include <stdio.h>
int main()
{
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
printf("%c,%c,%c",a,b,c);
return 0;
}
大致过程:
字符输入--getchar
getchar()函数的功能是从缓冲区中读取一个字符,注意,是一个字符。
如果缓冲区中没有字符可以读取时,getchar()就会等待我们输入一个字符,然后把它读走
如果缓冲区中存在字符,getchar()就不等我们输入,直接读取缓冲区中的字符。
与此对应的是putchar(),它能够向终端输出一个字符
#include <stdio.h>
#include <string.h>
int main()
{
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
char x=getchar();
printf("%c,%c,%c\n",a,b,c);
printf("%c\n",x);
putchar(x);
return 0;
}
2.字符串
字符串输入--scanf
补充一下字符串初始化定义的几种形式:
//方式一:数组形式
//1.指明数组长度
//以字符形式初始化,后面会自动添0
char str1[10]={'a','b','c','d'};
//还可以以字符串的形式赋值,而且这种可以通过数组名修改字符串
char str2[10]={"hello"};//可以把{}省掉
char str2[10]="hello";
//2.不指明数组长度
char str3[]={'e','f','g','h',0};
//不会在后面自动添0,需手动添加。注意这里添的是'\0'或者0,不能是'0',
//方式二:指针形式
char* str="gyp";
char* str = (char*)malloc(100 * sizeof(char));
//注意:指针初始化的时候必须要有值,不能出现空指针的形式char* str;
字符串的输入参数是已经定义好的“字符数组名”(指针), 不用加&,因为在C语言中数组名就代表该数组的起始地址
#include <stdio.h>
int main(){
char str[20]; //str是string的缩写, 即字符串
printf("请输入字符串:");
scanf("%s", str); /*输入参数是已经定义好的“字符数组名”, 不用加&,
因为在C语言中数组名就代表该数组的起始地址*/
printf("输出的结果是:%s\n", str);
return 0;
}
原因是用 scanf 输入带空格的字符串时系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串,所以只会将空格之前的字符串存储到定义好的字符数组中。
解决方法:
以空格为分隔符,数有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i am working”有两个空格,表示有三个字符串,那么就定义三个字符数组:
# include <stdio.h>
int main(){
char str1[20], str2[20], str3[20];
printf("请输入字符串:");
scanf("%s%s%s", str1, str2, str3);
printf("输出的结果是:%s %s %s\n", str1, str2, str3); //%s间要加空格
return 0;
}
字符串输入--gets
在<string.h>头文件中
字符串输入函数gets
格式:gets(字符数组)
功能:从键盘键入以回车结束的字符串放入字符数组中,并自动加’\0’
说明:输入串长度应小于字符数组维数,字符串中可以包含空格
字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串(输出完,自动换行,即用’\n’替’\0’)
说明:字符数组必须以’\0’结束
gets可以很好的解决当我们输入一个字符串的时候,scanf会因为空格结束的尴尬场景。
#include <stdio.h>
#include <string.h>
int main()
{
char str[20];
printf("请输入字符串:");
gets(str);
printf("请输出字符串:");
puts(str);
return 0;
}