关于用scanf()输入string类型引起的问题
我们都知道scanf()是可以输入string类型的:
如:
#include <stdio.h> #include <string> #include<iostream> using namespace std; int main() { string a; a.resize(6); //需要预先分配空间,超出空间会被截取 scanf("%s", &a[0]); cout << a;//用printf("%s",a.c_str())也可以输出 return 0; }
这种情况是一定不会出错的。
但还有一些人认为可以这样:
#include<cstdio> #include<iostream> #include<string> #include<cstring> using namespace std; int main(){ string a; scanf("%s",a.c_str()); printf("%s",a.c_str()); return 0; }
这样子并没有预先开辟空间:
运行结果如下图:

可以看到这是可以的,但这样子会出现一些潜在的危险,如果我们将
printf("%s",a.c_str());改为cout<<a;
则输出为空,如下图:

在一些情况下我们用scanf()利用刚才上述的方法输入string类型时(scanf("%s",a.c_str());),且并没有开辟空间,如果将输入的string赋值给其他string类型时,则会出现赋值为空。但仅可以通过
printf("%s",a.c_str());进行输出(cout<<a不行),仅此而已,a实际上仍为空。
因此在对string用scanf()进行输入时一定要进行开辟空间。

浙公网安备 33010602011771号