string a;
scanf("%s",&a);
当我运行程序并输入表达式的字符串时,给出了一个错误“未处理的异常:访问冲突写入位置0x000EEFFEE”。
而
char a[20];
scanf("%s",a);
工作正常。 是否因为scanf和printf是从C继承而来的。 我可以使用哪些方法来修复错误 是否有可能使printf scanf与c ++字符串一起工作。
答案 0 :(得分:2)
std::string
无法与printf
一起使用的原因是std::string
不是字符序列。
printf
函数需要一系列由' \ 0'终止的字符。
我们知道std::string
类可以实现为:
class string
{
unsigned int capacity;
unsigned int size;
char * p_char_sequence;
};
如您所见,前两项不是字符。
此外,printf
没有std::string
格式说明符。
总之,不能保证std::string
内存中的第一项是字符;它可以是一个阶级或结构。
有一种缓解,即std::string::c_str()
方法。此方法返回指向等效于std::string
内容的C样式字符串的指针。
修改1:scanf
scanf
函数更有趣。 scanf
函数需要指向字符数组的指针。无法保证std::string
中的第一个内存地址是一个字符序列。请参阅上面的printf
说明。
此外,无法保证std::string::c_str()
返回的指针对接收字符有效。它可能是内存中的临时区域,仅用于输出。因此,它无法用于scanf
。
scanf
函数会将字符写入数组位置,直到输入终止。这意味着如果为3个字符分配空间而User输入20个字符,则{{ 1}}函数将开始覆盖数组并写入其后的任何内容。这可能会触发系统错误(例如在程序的区域外写入)或写入硬件地址。这就是为什么大多数参考文献都说使用scanf
可以指定限制或容量的原因。
答案 1 :(得分:0)
你需要使用带有scanf而不是c ++字符串的c-strings。 Redeclare表达式为char表达式[N];其中N是足够大的字符数来存储整个单词。你也不需要&当你将它传递给scanf时,因为数组会自动转换为指针。
更好的方法是用cin >> expression;
替换scanf并用cout << expression;
替换printf,这是用c ++编写的方法。