①当scanf()用于从标准输入设备读入整数或字符时,scanf()读取一个整数或一个字符后结束。但是我们在输入后会按ENTER键表示结束,此时ENTER产生的换行符被存入了输入缓冲区中,看下面代码:
#include
int main()
{
char a;
int b;
scanf("%d", &b);
printf("%d", b);
a = getchar();//**a将逗留在缓冲区的\n读取**
putchar(a);
return 0;
}
结果为:
②当scanf()用于输入字符串时,它遇到空格键、ENTER键、TAB键都会结束读取;相同的,用于结束的ENTER键留在缓冲区。
#include
int main()
{
char a[10];
scanf("%s", a);
printf("%s", a);
return 0;
}
结果为:
**对于字符串的输入不建议使用scanf()函数;一定要用也可以,可以用正则表达式进行写格式说明:
1.%[^××]:遇到××才停止读取:
#include
int main()
{
char a[10];
scanf("%[^\n]", a);
printf("%s", a);
return 0;
}
2.%[××]:只读入××内容,注意此时键盘输入的只能是××内容。
#include
int main()
{
char a[10];
scanf("%[abc]", a);
printf("%s", a);
return 0;
}
另外:用scanf("%[^/n]%*c",str)可以解决缓冲区遗留的\n,%*c的作用是读入/n,但不赋值给任何变量。
如果使用的是VS2019,在用到scanf()时会提示错误:
This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Project2 E:\编程\204\Project2\tt.c 5 。(使用scanf()可以在项目–××属性–C/C+±-预处理器–预处理器定义,在后面添_CRT_SECURE_NO_WARNINGS)
编译器认为scanf()函数不安全,因为如果输入的长度超过了给定的范围,就会覆盖其他数据区,这称为“堆栈溢出”或“缓冲区溢出”。编译器给出了更为安全的scanf_s()函数。
#include
int main()
{
char a[10];
scanf_s("%s", a,10);
printf("%s", a);
return 0;
}
上面程序中scanf_s()的第二个参数10表示接受10-1个字符,注意要留一个空位给空字符。
gets()常用来输入字符串,遇到空格与TAB键不会结束,遇到ENTER键结束,gets()函数读取ENTER键但不保存,用’\0’取代’\n’。
#include
int main()
{
char a[10],b;
gets(a);
printf("%s", a);
b = getchar();
printf("%c", b);
printf("0");
return 0;
}
输入i love C按ENTER键后输出i love C,光标在第二句后面,等待输入字符赋给b,说明缓冲区没有’\n’存在。
但是gets()的风险是很大的。例如:
#include
int main()
{
char a[10];
gets(a);
printf("%s", a);
return 0;
}
输入:aaaaaaaaaaaaaaaaaaaaaaaaaaaa
编译器提示错误:
这种错误是数组越界,gets()无法检查数组是否越界。此时可以用gets_s()。
gets_s与scanf_s()一样,有第二个参数,用法相同。
getchar()可以从缓冲区读取任意一个字符,用getchar()可以实现不指定数组长度进行输出字符串:
#include
int main()
{
char a;
while ((a = getchar()) != '\n')
putchar(a);
return 0;
}
1、scanf()、scanf_s()
返回成功读取数据的个数。
#include
int main()
{
char a,c;
int b;
b = scanf("%c%c", &a,&c);
printf("%d", b);
return 0;
}
输入a c
输出为2
2、gets(buffer)、gets_s(buffer)
读取成功,函数返回与buffer相同的指针。读入过程中遇到EOF或发生错误,函数返回NULL指针。
#include
int main()
{
char a[20],*c;
c = gets(a);
printf("%s", c);
return 0;
}
输入i love C
输出i love C
3、putchar()
返回读取的字符。
以上内容是C语言字符输入的一些个人总结,如有错误欢迎留言指正。