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; }

结果为:
C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片

②当scanf()用于输入字符串时,它遇到空格键、ENTER键、TAB键都会结束读取;相同的,用于结束的ENTER键留在缓冲区。
#include int main() { char a[10]; scanf("%s", a); printf("%s", a); return 0; }

结果为:
C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片

**对于字符串的输入不建议使用scanf()函数;一定要用也可以,可以用正则表达式进行写格式说明:
1.%[^××]:遇到××才停止读取:
#include int main() { char a[10]; scanf("%[^\n]", a); printf("%s", a); return 0; }

C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片

2.%[××]:只读入××内容,注意此时键盘输入的只能是××内容。
#include int main() { char a[10]; scanf("%[abc]", a); printf("%s", a); return 0; }

C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片

另外:用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; }

C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片

输入i love C按ENTER键后输出i love C,光标在第二句后面,等待输入字符赋给b,说明缓冲区没有’\n’存在。
但是gets()的风险是很大的。例如:
#include int main() { char a[10]; gets(a); printf("%s", a); return 0; }

输入:aaaaaaaaaaaaaaaaaaaaaaaaaaaa
编译器提示错误:
C语言中scanf()、scanf_s()、gets()、gets_s()、getchar()函数用法及注意事项
文章图片
这种错误是数组越界,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语言字符输入的一些个人总结,如有错误欢迎留言指正。

    推荐阅读