【问题标题】:C++ storing an element of a string array into a variableC ++将字符串数组的元素存储到变量中
【发布时间】:2018-09-26 20:10:14
【问题描述】:

我目前正在使用 C++ 进行编码,并且对它相当陌生。我遇到了将字符串数组的元素转换为变量的问题。 cout 语句 dcity[selection-1] 按预期工作。但是,我无法将 dcity[selection-1] 存储到名为 departmentLocation 的变量中。 Visual Studios 给我一个错误,即没有合适的从字符串到字符的转换函数。有人对如何正确存储这个有建议吗?谢谢!

int main()
{

int selection = 0;
char departureLocation;


std::string dcity[] = { "Seattle Detroit Seattle Chicago Houston Seattle" };
std::cout << "Please choose a number from the list";
std::cin >> selection;
std::cout << dcity[selection-1];


departureLocation=dcity[selection-1]

};

【问题讨论】:

  • 你想要一个字符串向量。
  • @NeilButterworth 代码中没有证据表明std::vector 比数组更适合预期目的。
  • 我真的很喜欢您尝试一次编写程序的方式,而不是一次编写所有程序。只是不要陷入认为因为你的程序编译它就会工作的陷阱。编写一小段代码,让它编译、测试并修复任何错误。然后才重复。
  • @Swordfish 向量几乎总是比数组更可取,因为它们随身携带它们的大小,因此可以很容易地作为函数参数传递。
  • @NeilButterworth 由于可以离开的城市数组在运行时不太可能发生变化,我宁愿建议 std::array&lt;std::string&gt; 或 ``std::array`。

标签: c++ arrays string char


【解决方案1】:

由于 C++ 是一种强类型语言,它不喜欢类型不匹配。 您已通过以下方式声明变量:

char departureLocation;

这意味着departmentLocation 是char 类型的变量,或单个字符。所以'C'可以进入departmentLocation,但“Chicago”不能,因为它不止一个字符。

您还像这样声明了您的数组:

std::string dcity[] =

在这里,您已将数组的类型定义为 std::string。所以数组的元素是字符串,而不是字符。

简短的回答是,您需要在声明时将departmentLocation 的类型更改为字符串,而不是char。比如:

std::string departureLocation;

我也没有在上面的代码中看到任何包含语句。要让 C++ 识别字符串类,您需要确保以下代码位于代码顶部的某处:

#include &lt;string&gt;

【讨论】:

  • 除了上面提到的问题,很明显,当你写这个std::string dcity[] = { "Seattle Detroit Seattle Chicago Houston Seattle" };时,你真正应该写的是这个std::string dcity[] = { "Seattle", "Detroit", "Seattle", "Chicago", "Houston", "Seattle" };字符串不会自动分割空格,你需要写多个用逗号分隔的字符串。
【解决方案2】:

dcitystd::strings 的数组。 departureLocation 是一个 char,它只能容纳一个字符。要存储(复制)数组 dcity 的元素,departureLocation 必须是 std::string 类型(或可以从 std::string 构造的任何其他类型):

std::string dcity[] = { "Seattle Detroit Seattle Chicago Houston Seattle" };
std::string departureLocation = dcity[0];

请注意dcity 是一个仅包含一个元素的数组。也许你想要一个数组,其中每个城市都是一个单独的数组元素:

std::string dcity[] = { "Seattle", "Detroit", "Seattle",
                        "Chicago", "Houston", "Seattle" };
std::string departureLocation = dcity[2];
std::cin >> selection;
std::cout << dcity[selection-1];

在使用用户输入作为数组索引之前,你应该做一些错误检查:

if (!(std::cin >> selection) || selection < 1 || selection > sizeof(dcity) / sizeof(*dcity)) {
    std::cerr << "Input error!\n";
    return EXIT_FAILURE;
}
std::string departureLocation = dcity[selection - 1];

如果您不需要数组元素的独立副本,您也可以使用对 std::string 的引用:

std::string &departureLocation = dcity[selection - 1];

请注意,使用 departureLocation 对字符串所做的更改现在将反映在数组元素 departureLocation 引用上。如果您不想允许更改,请使用const 参考:

std::string const &departureLocation = dcity[selection - 1];

【讨论】:

  • 这是一个一个字符串的数组。
【解决方案3】:

首先编译器认为数组中只有一个元素,因为c++中的数组每个元素之间应该有逗号,每个字符串必须用双引号括起来。第二个错误是你试图保存数据将字符串输入到数据类型为 char 的变量中。

代码

#include<string>
#include<iostream>

using namespace std;
int main()
{

int selection=0;
string depaturelocation;
string dcity[]={"Seattle","Detroit","Seattle","Chicago","Houstan","Seattle"};
int size=sizeof(dcity)/sizeof(dcity[0]);
for(int i=0;i<size;i++)
{
   cout<<i+1<<" : "<<dcity[i]<<endl;
}
cout<<"please enter the destination no:";
cin>>selection;

for(int i=0;i<size;i++)
{
    if(selection-1==i)
    {
        depaturelocation=dcity[i];
    }
}
cout<<"destination:"<<depaturelocation;
return 0;
}

【讨论】:

  • 你真的不需要写一个循环来执行对depaturelocation的赋值
  • 是的,没必要,你可以直接给 depaturelocation 赋值
【解决方案4】:

您的代码几乎不需要修改。 1. 数组的初始化是通过给它的组件值以逗号分隔。请注意,每个单独的元素都应该与声明的数组的类型相同。 2. C++对类型匹配非常严格。我们只能分配相同类型的对象。在上面的代码中,一个字符串对象被分配给一个违反规则的字符变量。 C 字符串是由空字符 (\0) 终止的字符数组。在 C++ 中,字符串是更高级的,它是一个具有非常有用的成员函数的对象。例如要获取字符串的长度,只需说 obj.length()。我们需要有字符数组,因为在字符串中可以有多个 char 元素。我们需要字符串对象的 c-string 才能进入字符数组。请看下面修改后的代码。

#include <iostream>
#include <cstring>
#include <string>
using namespace std;    //std::  is not required in front of cout 
int main()
{
    int selection = 0;

    string dcity[] = { "Seattle", "Detroit" ,"Seattle", "Chicago", "Houston","Seattle" };
    cout << "Please choose a number from the list";
    cin >> selection;
    cout << dcity[selection-1] << endl;

    char departureLocation[dcity[selection-1].length()+1];
    strcpy(departureLocation,dcity[selection-1].c_str());
    cout << departureLocation;
   // cout << *c;
    return 0;
}

【讨论】:

  • 如果使用 C 字符串没有任何好处,请不要使用它们。在 C++ 中也没有变长数组这样的东西。
  • 感谢您的评论。但是你能解释一下为什么在没有重大好处的情况下不应该使用 C 字符串吗?而且我在帖子中没有说任何关于可变长度数组的内容。
  • “我在帖子中没有说任何关于可变长度数组的内容。”你确实使用过它们:“char departureLocation[dcity[selection-1].length()+1];
  • 在某些编译器中通过扩展允许可变长度数组,但结果可能是不幸的。例如,它们破坏了 sizeof 的编译时行为。更喜欢使用vector
【解决方案5】:

您可以将选择存储在 std::string 中,因为 char 只能存储单个字符。还要注意访问数组的位置不要越界(如果有人输入 1000 等会发生什么)以及非程序员用户索引以 1 开头的列表。您可以尝试以下代码:

#include <iostream>
#include <string>

int main()
{
    const auto Cities = { "Seattle", "Detroit", "Seattle", "Chicago", "Houston", "Seattle" };
    std::cout << "Please choose a number from the list (1-" << Cities.size() << "): ";

    int selection = 0;
    std::cin >> selection;
    if (selection < 1 || selection > Cities.size()) {
        std::cout << "\ninvalid selection!\n";
        return -1;
    }

    const std::string departureLocation = *(Cities.begin() + selection - 1);
    std::cout << "\nyou selected: " << departureLocation;

    return 0;
};

【讨论】:

  • 我不能确定,但​​我怀疑反对票是因为您更改的提问者代码比您解释的要多。无法解释的代码会导致剪切和粘贴以及 Cargo Cult 行为,即程序员在不了解他们为什么这样做的情况下模仿您正在做的事情。
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2021-11-09
  • 1970-01-01
  • 2017-10-20
  • 2012-05-15
相关资源
最近更新 更多