【问题标题】:Initializing an array of characters with a string variable使用字符串变量初始化字符数组
【发布时间】:2017-06-14 09:12:51
【问题描述】:

我知道char a[] = "Hello World"; 有效,但我想知道是否有一种方法可以让字符数组由运行时输入的字符串初始化。 例如:

string word;

cout << "Enter a word ";

cin >> word;

char a[] = word;

我知道 clang++ 不接受这一点,因为它说“数组初始化程序必须是初始化程序列表或字符串文字”。

有没有不使用指针的解决方法?

【问题讨论】:

  • 你使用std::vector&lt;char&gt;。基本上是std::string
  • 为什么不直接使用std::string?它使您可以访问其内部字符数组。
  • 我知道您可以将字符串用作更简单的解决方案,但我正在尝试了解有关字符数组以及它们之间的区别、字符指针和字符串的更多信息。
  • 问题是你需要事先分配内存,所以你不知道用户会输入多少个字符。

标签: c++ arrays string char string-literals


【解决方案1】:

使用c_str

http://en.cppreference.com/w/cpp/string/basic_string/c_str

像这样复制到数组:

strcpy(a, word.c_str());

【讨论】:

  • word的长度大于数组大小怎么办?
  • 我认为您需要定义一个 MAX_SIZE int 来将该 char 数组初始化为该大小。如果长度太大,请重新提示用户输入较小的字符串。
  • 是的。差不多。关注 Raindrop7 的回答。
  • 这还是需要你事先知道长度。
【解决方案2】:

你可以创建一个固定大小的字符数组,就像我们在结构中使用的那样:char name[100]... 然后输入字符串,然后使用 strpy 进行复制。

char a[100];
string word;

cout << "Enter a word ";
cin >> word;

strcpy(a, word.c_str());

上面的代码可以正常工作,但问题是如果用户输入一个大于 100 个字符的文本,那么你就会 UB。

事实上,堆栈数组在编译时必须具有恒定的大小,而字符串可以在运行时更改大小,这意味着您不能这样做,但是还有另一种方法,您可以根据字符串的运行时大小创建动态数组然后使用strcpy():

string word;
cout << "Enter a word ";
cin >> word;

char* a =  new char[word.length() + 1]; // 1 for Null character
strcpy(a, word.c_str());

 delete[] a;
  • 我最喜欢的另一种选择是使用std::vector&lt;char&gt;

    vector<char> a;
    char c;
    
    while(SomeConditionIsTrue){
        cin >> c;
        a.push_back(c);
    }
    
    for(int i(0); i < a.size(); i++)
        cout << a[i];
    

【讨论】:

  • 这个答案没有错,但挑剔,它不会。这意味着,它没有做 OP 认为它可以做的事情。另外,使用循环来填充向量是非常低效的。 std::vector 有一个接受两个迭代器的构造函数。你应该建议这样做。
  • @StoryTeller:你的意思是关于矢量的部分?
  • “不是它”?您使用new char[] 演示的部分。它与本地数组的作用不同。
  • @StoryTeller: 但是本地数组在编译时必须有一个恒定的大小,而字符串不是
  • 没错。这就是为什么当你说“你能做到”时,这是错误的。因为你做不到,你用动态分配展示了完全不同的东西。
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 2011-05-15
  • 2015-01-31
  • 2011-12-11
  • 1970-01-01
  • 2021-04-16
  • 2021-07-02
相关资源
最近更新 更多