今天写字符串反转的代码,发现了一个问题:
当按照下标一个个地为字符串赋值时,使用 cout 并不能把这个字符串输出出来。如下的代码输出的是空值:
PS.这里使用的是万能头文件,是包含string头文件的,按理说应该能够输出字符串类型啊。。。
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
for(int i = 0; i < 3; i++)
{
cin >> a[i];
}
cout << a <<endl;
return 0;
}
但是如果一个个的输出,如下,字符串a中的值却能输出,表示a是已经被赋予了值的。
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
for(int i = 0; i < 3; i++)
{
cin >> a[i];
}
for(int i = 0; i < 3; i++)
{
cout << a[i];
}
return 0;
}
并且当为字符串整体赋值时,使用 cout 就能够将字符串输出。如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
a = "anjdndd";
//或者 cin >> a;
cout << a <<endl;
return 0;
}
这是为什么呢?
搜索一番后发现:我在定义字符串的时候使用的是默认构造函数 string a,b;
此时并没有为 a 和 b 开辟空间。此时使用下标存储是极其不规范的,这个编译时超出了范围竟然没报错 ,也是神奇。
解决方法是定义时要改成:string a(6,'\0'), b(6,'\0');
这个形式,事先为a,b指定一个大小。
如此定义,无论时按照下标赋值还是直接使用字符串形式赋值都能够使用cout输出了。
接近半年没有写c++程序了,很多内容又忘了。忘了学学了忘,真伤脑筋。。。。。
不能认输!加油加油加油! 必胜!!!