C ++ хранит элемент массива строк в переменную - PullRequest
0 голосов
/ 26 сентября 2018

В настоящее время я пишу на C ++ и довольно плохо знаком с этим.Я сталкиваюсь с проблемами с преобразованием элемента массива строк в переменную.Оператор cout dcity [selection-1] работает как задумано.Тем не менее, я не могу сохранить dcity [selection-1] в переменной с именем выездной.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]

};

Ответы [ 5 ]

0 голосов
/ 26 сентября 2018

Ваш код нуждается в небольшой модификации.1. Массив инициализируется указанием значений его компонентов через запятую.Обратите внимание, что каждый отдельный элемент должен быть того же типа, что и объявленный массив.2. C ++ очень строг с соответствием типов.Мы можем назначать объекты только одного типа.В приведенном выше коде строковый объект присваивается символьной переменной, которая противоречит правилу.Строка AC - это массив символов, оканчивающийся нулевым символом (\ 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;
}
0 голосов
/ 26 сентября 2018

Прежде всего, компилятор считает, что в массиве есть только один элемент, потому что массивы в 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;
}
0 голосов
/ 26 сентября 2018

dcity - это массив std::string с.departureLocation - это char, который может содержать только один символ.Чтобы сохранить (скопировать) элемент массива dcity, departureLocation должен иметь тип std::string (или любой другой тип, который может быть построен из std::string):

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

BeОсознай, что 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];
0 голосов
/ 26 сентября 2018

Вы можете сохранить выборку в 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;
};
0 голосов
/ 26 сентября 2018

Поскольку C ++ является языком со строгой типизацией, ему не нравятся несоответствия типов.Вы объявили свою переменную следующим образом:

char departureLocation;

Это означает, что вылет-переменная является переменной типа char или одним символом.Таким образом, «C» может входить в вылет «LocationLocation», а «Chicago» - нет, так как он содержит более одного символа.

Вы также объявили свой массив следующим образом:

std::string dcity[] =

Здесь вы определили тип массива как std :: string.Таким образом, элементы массива являются строками, а не символами.

Краткий ответ заключается в том, что вам нужно изменить тип выездного местоположения на строку при объявлении, а не на символ.Что-то вроде:

std::string departureLocation;

Я также не видел ни одного оператора включения в вашем коде выше.Чтобы C ++ распознал строковый класс, вам нужно убедиться, что в верхней части кода где-то находится следующее:

#include <string>

...