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);
coutscanf()
使用%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;
}