【问题标题】:When reading a C-style string in c++ an error appears在 c++ 中读取 C 风格的字符串时出现错误
【发布时间】:2014-12-02 13:24:03
【问题描述】:

首先,看下面的简单代码。

int main(){
    char *name;
    cout << "Enter your name: ";
    cin >> name;
    cout << "Your name is: " << name;

    return 0;
}

前面的代码给了我以下错误warning: deprecated conversion from string constant to 'char*'
但我已经通过以下方式解决了这个问题:

const char *name;

编译代码后,我有另一个错误no match for 'operator&gt;&gt;' (operand types are 'std::istream {aka std::basic_istream&lt;char&gt;}' and 'const char*')

上一个错误是什么原因,如何解决?

【问题讨论】:

  • char * 没有为要输入的字符串分配任何存储空间。您应该改用std::string name;
  • 两个版本(有和没有const)有部分相同,部分不同的问题。但是,既然您标记了问题“c++”:为什么不使用 std::string 来完全避免内存/指针问题?
  • 您不会从该代码中收到该警告。我猜它实际上类似于char * name = "something";。在任何情况下,您都不能写入字符串常量或未初始化的指针,因此请使用std::string

标签: c++


【解决方案1】:

您还没有初始化任何可以读取字符串的内存。 char * 是一个指针,指向内存中可以读取字符串的位置,但首先必须使用newmalloc 分配内存。

但是,在 C++ 中还有另一个更好的选择:使用 std::string:

#include <string>

int main()
{
    std::string name;
    cout << "Enter your name: ";
    cin >> name;
    cout << "Your name is: " << name;

    return 0;
}

如果您打算使用 c 字符串,您可以分配内存并执行以下操作:

int main()
{
    char name[MAX_SIZE];
    cout << "Enter your name: ";
    cin.get(name, MAX_SIZE);
    cout << "Your name is: " << name;

    return 0;
}

(感谢 Neil Kirk 的改进)

【讨论】:

  • 我不管用c还是c++,有没有办法用c-string?
  • @Sunrise 是的,但你为什么要这样做?
  • @Sunrise:是的,但它更复杂且容易出错。为什么要这样做?
  • 这只是为了练习,但请给我任何使用 c-string 的方法来处理我的代码。
  • 输入超过1024个字符怎么办?
猜你喜欢
  • 2019-04-05
  • 2020-06-29
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多