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