c++ - 应用于字符串的 std::cin 和 scanf() 之间的区别

标签 c++ string scanf cin

我正在尝试将字符串的第一个字符写入 char 类型的变量。使用 std::cin (注释掉)它工作正常,但是使用 scanf() 我得到运行时错误。当我输入“LLUUUR”时它会崩溃。为什么会这样?使用 MinGW。

#include <cstdio>
#include <string>
#include <iostream>
int main() {
    std::string s;
    scanf("%s", &s);
    //std::cin >> s;
    char c = s[0];
}

最佳答案

scanfstd::string 一无所知。如果您想读入底层字符数组,您必须编写 scanf("%s", s.data());。但是请务必使用 std::string::resize(number) 确保字符串的底层缓冲区足够大!

通常:不要将scanfstd::string 一起使用。

另一种选择,如果你想使用 scanfstd::string

int main()
{
    char myText[64];
    scanf("%s", myText);

    std::string newString(myText);
    std::cout << newString << '\n';

    return 0;
}

读取后构造字符串。

现在直接在字符串上:

int main()
{
    std::string newString;
    newString.resize(100); // Or whatever size   
    scanf("%s", newString.data());

    std::cout << newString << '\n';

    return 0;
}

虽然这当然只会读到下一个空格。因此,如果您想阅读整行,最好使用:

std::string s;
std::getline(std::cin, s);

关于c++ - 应用于字符串的 std::cin 和 scanf() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49469453/

相关文章:

scanf 的奇怪行为

日历项目几乎用 C 完成

c - 为什么 scanf 在读取字符串时会崩溃?

c++ - 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

c++ - 在没有全局变量的情况下,使用 sigaction() 打破 C++ 中的无限循环

java - 使字符串在多个类中可见

java - 输入字符串压缩为字符串

javascript - 获取动态字符串的最后 2 个字符

c++ - 从初始化列表分配给数组

c++ - 在 C++ 中用私有(private)函数覆盖公共(public)虚函数