关于用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()进行输入时一定要进行开辟空间。
 

posted @ 2021-11-23 19:51  银发制御  阅读(750)  评论(0)    收藏  举报