C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
1、scanf() ①当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,但不赋值给任何变量。
2、scanf_s() 如果使用的是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个字符,注意要留一个空位给空字符。
3、gets()、gets_s() 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()一样,有第二个参数,用法相同。
4、getchar() 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语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项】以上内容是C语言字符输入的一些个人总结,如有错误欢迎留言指正。
推荐阅读
- 生活中哪些小习惯有助于学好英语()
- 寻找遗落的情书丨唐琬(欲笺心事,独语斜栏)
- 组会|MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)
- Go语言单向channel的争议
- Linux系统网络编程|Linux系统(基础IO)
- 语义分割|上采样、反卷积、上池化的区别
- 文案必备(可能是你最需要的微商广告语大盘点)
- 我读《论语》
- Python|Python Learning-条件控制语句
- 想和你一起学英语——7.28