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

1、scanf()

①当scanf()用于从标准输入设备读入整数或字符时,scanf()读取一个整数或一个字符后结束。但是我们在输入后会按ENTER键表示结束,此时ENTER产生的换行符被存入了输入缓冲区中,看下面代码:

#include<stdio.h>
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<stdio.h>
int main()
{
 char a[10];
 scanf("%s", a);
 printf("%s", a);
 return 0;
 }

结果为:
在这里插入图片描述
**对于字符串的输入不建议使用scanf()函数;一定要用也可以,可以用正则表达式进行写格式说明:
1.%[^××]:遇到××才停止读取:

#include<stdio.h>
int main()
{
 char a[10];
 scanf("%[^\n]", a);
 printf("%s", a);
 return 0;
}

在这里插入图片描述
2.%[××]:只读入××内容,注意此时键盘输入的只能是××内容。

#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
int main()
{
 char a;
 while ((a = getchar()) != '\n')
  putchar(a);
 return 0;
}

补充:各函数返回值

1、scanf()、scanf_s()
返回成功读取数据的个数。

#include<stdio.h>
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<stdio.h>
int main()
{
 char a[20],*c;
 c = gets(a);
 printf("%s", c);
 return 0;
}

输入i love C
输出i love C
3、putchar()
返回读取的字符。

以上内容是C语言字符输入的一些个人总结,如有错误欢迎留言指正。

评论 1 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

F l e

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值