C语言&&C++中与接收、输出字符相关的问题

C语言中,在使用scanf("%c",&data);读取一个字符时,有时会遇到scanf吞回车符的情况。 这里搜到几种常用的解决方法:
1.在scanf()中使用’\n’屏蔽回车符号。

scanf("\n%c",&c);

2.在scanf()格式串最前面添加空格,屏蔽回车字符

scanf(" %c",&c); //%c前面加空格,过滤回车

3.在接收字符前,使用getchar()来读取一次回车符号

getchar(); //专门用来读取上次输入的回车符号
scanf("%c",&c);

4.在接收字符前,使用fflush()清空输入流中缓冲区中的内容

fflush(stdin); //清空输入流缓冲区的字符,注意必须引入#include<stdlib.h>头文件
scanf("%c",&c);

C++中输出字符数组时的常见问题:
例1:

#include<iostream>
using namespace std;
int main() 
{
	char a[8];
	for (int i = 0; i < 8; i++)
		cin >> a[i];
	cout << a << endl;
	return 0;
}

运行结果:在这里插入图片描述
分析:输出时出现汉字乱码
原因:字符数组里存放内容没有字符结束标志 ‘\0’

解决方法:

#include<iostream>
using namespace std;
int main() 
{
	char a[8];
	for (int i = 0; i < 8; i++)
		cin >> a[i];
	a[8] = '\0'; //最后留一个位置给'\0'
	cout << a << endl;
	return 0;
}

运行结果:在这里插入图片描述
分析:在字符串的末尾手动加’\0’,此时循环遇到’\0’即结束,不会出现汉字乱码

例2:

#include<iostream>
using namespace std;
int main() 
{
	char words[] = { 'a', 'b', 'c', 'd', 'e' };
	cout << words << endl;
	return 0;
}

同例1情况,字符数组末尾没有’\0’作为结束,会出现汉字乱码

解决方法:手动在数组末尾加’\0’

#include<iostream>
using namespace std;
int main() 
{
	char words[] = { 'a', 'b', 'c', 'd', 'e','\0' };
	cout << words << endl;
	return 0;
}

以上两种方法都需要自己手动加’\0’,也可以使用另外两种系统自动加’\0’的方法
方法1:直接用cin输入字符数组,最后系统会自动加上\0空字符,且它占数组的一个char内存

#include<iostream>
using namespace std;
int main() 
{
	char a[9];
	cin >> a ;//最后会自动加上\0空字符,且它占数组的一个char内存
	cout << a  << endl;
	return 0;
}

方法2:运用get()函数或getline函数,同样最后系统会自动加上\0空字符,且它占数组的一个char内存

#include<iostream>
using namespace std;
int main()
{
	char ch[50];
	cin.getline(ch, 30);//可以换成cin.get(ch, 30)
	cout << ch << endl;
	return 0;
}

%s VS %c
%c格式对应的是单个字符,%s格式对应的是字符串。

char a;
scanf("%c",&a); //只能输入一个字符。

char b[20];
scanf("%s",b); //可以输入一串不超过20字符的字符串。

输入的时候scanf("%c", &a);这里的&不能少;而scanf("%s",s);这里不能有&符号

警告:缺少“scanf_s”的整型参数(对应于转换说明符“2”
原因分析:scanf_s(“%s”, b); 对于变量b这个字符串,没有传入字符串长度的参数,因为在调用scanf_s()函数时,如果必须提供一个数字以表明最多读取多少位字符。比如:char b[20];写成scanf_s(“%s”,b,20);才是正确的,有这个参数20使准确性、安全性提高。

=================================================================================================

c语言输入有空格的字符串

  • scanf(“%s”,str); 遇到空格就停止接收后面的字符。 scanf(“%s”, str, 10);
  • 不能接收带空格的字符串输入,虽然它的指定长度是10, 但是遇到空格时即使没有满10个字符它也自动结束输入了。

解决方法:

  1. 用 gets() 可以读取空格, 直到回车才会结束输入(此方法可输入多行字符串)
char str[80];
gets(str);   //可以读取空格, 回车才会结束输入

Microsoft Visual Studio 2022里的写法是gets_s(str);

  1. 使用"%[^\n]"可以接收输入带空格的字符串,直到回车才结束接收(此方法只能输入一行字符串)
char str[10];
scanf("%[^\n]",str); //可以读取空格,回车结束输入

在这里插入图片描述

  • 附:正则中的[xxx],%[abc]表示字符组合包括a、b和c,如果遇到这三个字符之外的字符,则停止接收。%[^abc]代表字符组合为abc以外的所有字符,至于横杠是否用于指定某个范围的字符%[a-z],则因编译器而异。
  • fgets 代替: fgets(temp,sizeof(temp),stdin);
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值