为什么 c++ 字符串不适用于 scanf 和 printf
Why dont c++ strings work with scanf and printf
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 ++中执行此操作的方法。
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- C++ Setter/Getter,cout 工作,printf 失败
- scanf() 只取数字作为输入,避免使用其他字符
- 为什么我的 scanf() 没有在我的数组上迭代我的 for 循环?
- Printf 命令不打印时添加了查找常见除数的新代码
- C++ - scanf() 和 printf() 执行顺序不对
- 为什么 printf 在 C++ 中的执行速度比 cout 快?另外scanf比cin慢,为什么?
- 在printf和scanf中%lli和%lld之间的区别?
- 字母 'f' 在 printf()、scanf() 和 seekg() 中的 'g' 代表什么?
- 为什么 CIN / COUT 比 scanf/printf 慢
- 从printf-scanf转换为cin-cout时出现问题
- Posix是否为printf/scanf提供格式字符串宏
- 为什么在这种情况下"printf scanf"比"cout cin"慢?
- 为什么 c++ 字符串不适用于 scanf 和 printf
- scanf、printf和boost::lexical_cast基本上不安全吗?
- 何时使用printf/scanf与cout/cin
- 比scanf和printf更有效的扫描和打印整数的方法
- 使用std::ios::sync_with_stdio(false)可以比scanf和printf更快