为什么c ++字符串不能与scanf和printf一起使用

时间:2015-12-07 01:26:42

标签: c++ printf scanf

string a;
scanf("%s",&a);
当我运行程序并输入表达式的字符串时,

给出了一个错误“未处理的异常:访问冲突写入位置0x000EEFFEE”。

char a[20];
scanf("%s",a);

工作正常。 是否因为scanf和printf是从C继承而来的。 我可以使用哪些方法来修复错误 是否有可能使printf scanf与c ++字符串一起工作。

2 个答案:

答案 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 ++编写的方法。