C++ 字符串的scanf函数

C++ 字符串的scanf函数,c++,scanf,C++,Scanf,问题很简单,下面的代码不起作用。它表示进程已完成,退出代码为-1073740940(0xC0000374)。删除符号不会改变任何事情 int main(){ string x; scanf("%s",&x); cout << x; } intmain(){ 字符串x; scanf(“%s”和&x); cout不能通过printf/scanf的…运算符传递复杂对象。许多编译器为此打印警告 scanf需要类型为char*的指针,指向%s参数的足够存储空间

问题很简单,下面的代码不起作用。它表示
进程已完成,退出代码为-1073740940(0xC0000374)
。删除符号不会改变任何事情

int main(){
    string x;
    scanf("%s",&x);
    cout << x;
}
intmain(){
字符串x;
scanf(“%s”和&x);

cout不能通过printf/scanf的…运算符传递复杂对象。许多编译器为此打印警告

scanf
需要类型为
char*
的指针,指向
%s
参数的足够存储空间。std::string完全不同

<>在C++中,IoSover运算符用于文本输入和输出。
cin >> x;
我会做好的

<>你不应该在C++中使用<代码> SCAFF <代码>。有很多陷阱,你找到其中一个。

另一个陷阱:
%s
在scanf上几乎总是未定义的行为,除非您确实确保源流只能包含大小有限的字符串。在这种情况下,
char buffer[size];
是正确的目标。
在任何其他情况下,您至少应该限制要扫描的字符串的大小。例如,使用
%20s
,当然还有一个匹配的字符缓冲区,
char buffer[21];
,在这种情况下。请注意大小+1。

您应该使用
cin
。但是如果您想使用
scanf()无论出于什么原因,仍然用<代码> STD::String 操纵字符串,然后您可以读取C字符串并使用它初始化C++字符串。

#include <iostream>
#include <cstdio>
#include <string>

using std::cout;
using std::string;

int main()
{
    char c_str[80];

    scanf("%s", c_str);
    string str(c_str);

    cout << str << "\n";
}
#包括
#包括
#包括
使用std::cout;
使用std::string;
int main()
{
char c_str[80];
scanf(“%s”,c_str);
字符串str(c_str);
cout
scanf()
使用
%s
格式说明符将字节读入预先分配的字符数组(
char[]
),并将指针传递给该数组

您的
s
不是字符数组。它是一个复杂对象
std::string

std::string*
char*
在任何方面都不相同。您的代码会以不可预知的方式覆盖复杂对象部分的内存,因此最终会导致崩溃

您的编译器应该对此发出警告,因为它知道
char*
不是
std::string*
,而且编译器很聪明,尽管C库函数的类型不安全,但可以检测到这样的错误

即使通过某个神奇的兼容层这是有效的,
字符串
也是空的


请改用I/O流。

如果要使用字符串,请使用
cin
(或
getline

如果要使用
scanf
,则需要一个字符数组(不要使用
&
):


您可以使用
char[]
而不是
string

include <iostream>
using namespace std;
int main()
{
  char tmp[101];
  scanf("%100s", tmp);
  cout << tmp;
}
包括
使用名称空间std;
int main()
{
char-tmp[101];
扫描频率(“%100s”,tmp);

我不能使用c-like字符串,或者最好使用
cin
来代替。我知道
cin
,但现在我想弄清楚这有什么问题。我注意到它比
cin
快,因此更适合于竞争性编程。我如何使用c-like字符串?为什么你认为它会起作用?哪些参考资料或文档Iation告诉过你它可以工作?谁解释说你可以用C库函数覆盖
std::string
?他们错了。你的可能重复是对的,但OP写道他也尝试了不使用
&
。“不幸的是,C库函数的类型不安全性,例如,这意味着编译器无法检测和拒绝不匹配。”——实际上,几个现代C++编译器可以在编译时验证和拒绝这个。
char text[30];
scanf("%s", text); //text is now read
include <iostream>
using namespace std;
int main()
{
  char tmp[101];
  scanf("%100s", tmp);
  cout << tmp;
}