这里先说下第一个坑,c++ 中通常是使用 cin
进行数据的输入,但是 cin 会默认以空格、TAB、换行符'\n'
,作为输入结束,所以使用 cin 是不能输入带空格的字符串的。下面将介绍c++中的输入带空格数据的几种常见方式:
1、对于字符数组
chat arr[100];
1、方法1:cin.getline(arr, length)
- arr 是定义的字符数组
- length 是要读取 length-1 个字符到 arr 中
具体:getline 读取整行数据,以换行符\n
作为输入的结束符号。但是不保存换行符
2、方法2:cin.get(arr, length)
- arr 是定义的字符数组
- length 是要读取 length-1 个字符到 arr 中
具体:也是读取整行数据,也是以\n
作为结束符,但是会保留换行符
#include<iostream> using namespace std; int main(){ char arr[10]={0}; // 数组初始化为0 string st; cin.getline(arr, 6); for(char i:arr){ cout<<i<<" "; } cout<<sizeof(arr)<<endl; return 1; } // 输入: //lihai // 输出: // l i h a i 10
2、对于 String 类型
#include<string> String st;
使用getline(cin, st)
,也是同样是读取整行数据,以换行符 \n
作为输入结束。
这里面就有坑了,如果在 getline的前面还有一个 cin 输入,那么就会出现,geline那一行直接”跳过“。原因就是,cin 数据输入之后,会有一个换行,此时接着 getline 就会读取到这个换行符,就认为是结束了。
#include<string> int main(){ int n; string st; cin>>n; getline(cin, st); for(char i:st){ cout<<i<<"-"; } return 1; } //输入: // 6 // 接着直接就输出,然后结束了 // 6
解决办法:在 cin 之后添加一个 getchar()
,读取掉换行符,就不会对后面的 getline 有影响。
int main(){ int n; int c1; string st; cin>>n; c1 = getchar(); // getchar重点,看下面的讲解 cout<<c1<<endl; getline(cin, st); for(char i:st){ cout<<i<<"-"; } return 1; } //输入: // 6 // lihai // 输出 // 10 // l-i-h-a-i-
这里面值得注意的是,getchar()
函数是将读取到的一个字符转换成 ASCII 值(int类型),如果不懂什么是 ASCII 码的可以看我之前写的文章ASCII、UTF8和Unicode之间的关系。例如上面的读取的是一个换行符 \n ,\n 对应的 ASCII 值是10,也就是上面输入6后回车就直接出来10。
总结:
遇到问题,多总结总输出,以备下次使用的时候,就不会乱找~
参考文章: https://blog.csdn.net/u012856866/article/details/77511809