为什么 c++ 字符串不适用于 scanf 和 printf

Why dont c++ strings work with scanf and printf

本文关键字:scanf printf 适用于 不适用 c++ 字符串 为什么      更新时间:2023-10-16
string a;
scanf("%s",&a);

当我运行程序并输入表达式字符串时,给了我一个错误"未处理的异常:访问违规写入位置0x000EEFFEE"。

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

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

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 个字符分配空间并且用户输入 20 个字符,则 scanf 函数将开始覆盖数组并写入其后的任何内容。 这可能会触发系统错误(例如在程序区域之外写入(或写入硬件地址。 这就是为什么大多数参考文献说在可以指定限制或容量的情况下使用fscanf

你需要将 c 字符串与 scanf 一起使用,而不是 c++ 字符串。 将表达式重新声明为 char 表达式[N];其中 N 是足够多的字符来存储整个单词。 此外,当您将其传递给scanf时,您不需要它的前面,因为数组会自动转换为指针。

更好的方法是将scanf替换为cin >> expression;并将printf替换为cout << expression;这是在c ++中执行此操作的方法。