字符串,字符数组,string输入输出scanf,gets,getchar

本文详细解释了scanf、cin、gets和scanf_s等C++输入函数在处理字符串时的行为差异,强调了处理空格、换行符的注意事项以及如何避免缓冲区溢出,推荐使用scanf_s以确保安全性。同时介绍了getchar用于逐字符读取的功能。
摘要由CSDN通过智能技术生成

scanf

  • 遇到空格,tab,回车都会结束输入

  • string :scanf("%s",&s[0]),需要先用resize预分配空间,建议用cin

string s;
s.resize(100);//必须先预分配空间
scanf("%s",&s[0]);
cout<<s;
//printf("%s\n", s); 错误的写法
printf("%s\n", s.c_str()); //正确的写法,c_str的作用就是将C++的string转化为C的字符串(char *)数组
  • 字符数组char a[]:scanf("%s",a),scanf_s("%s", str, sizeof(str))

  • 与scanf函数相比,scanf_s函数多了一个参数用于指定读取的最大字符数。这个参数是为了防止缓冲区溢出而引入的,可以有效地防止一些安全性问题,建议用scanf_s

	char a[20];
	scanf("%s",a);
	printf("%s",a);
    char str[100];
	scanf_s("%s", str, sizeof(str));
	printf("您输入的字符串是:%s\n", str);
  • 字符数组char str[2],scanf("%s",str)不会检查是否越界,scanf在遇到空白符(\n、\t…)之前一直将字符读入输入缓冲区中,超过了字符数组的长度,可能会发生非法访问以及其他未知的错误。

  • 输入缓冲区有数据:从输入缓冲区读取,从非空(回车、空格、tab)字符开始,遇到空格结束(回车、空格、tab)。末尾回车会被留在输入缓冲区,并且不做处理。 输入缓冲区没有数据:获取键盘输入,当按下回车的时候,输入的数据连同刚按下的回车符被送入输入缓冲区。然后从输入缓冲区区读取数据。(cin与scanf对输入数据的处理相同)

  • 读入的字符串有空格时,不建议用scanf

  • //输入:aaa bbb 输出:aaa bbb 只输入1次,scanf("%s",b)不发挥作用
    char a[20];
    char b[20];
    scanf("%s",a);
    printf("%s ",a);//可改为cout
    scanf("%s",b);
    printf("%s",b);
    
    char a[20];
    char b[20];
    cin>>a;
    printf("%s ",a);
    cin>>b;
    printf("%s",b);

 输入:aaa bbb 输出:aaa bbb 只输入1次,scanf("%s",b)不发挥作用

gets&puts

  • gets() 的作用是从键盘上读取字符串

  • gets() 可以接收空格、Tab键, 碰到回车键输入才结束;而scanf碰到空格、回车、Tab键 都会结束输入。

  • 如果读入回车,把回车替换为\0并结束该字符串

  • puts在 输出的时候会将字符串末尾的\0'自动换成\n'

  •  gets() 和scanf() 都不能检测越界。

  • 读入的字符串有空格时,建议用gets

char a[20];
char b[20];
gets(a);
cout<<a<<'\n';
gets(b);
cout<<b;

getchar

  • 字符输入函数,没有参数,从输入缓冲区里面读取一个字符,一次只能读取一个字符,包括回车符,所以输入密码后要先用getchar读取回车

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}
  • getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值