C ++: Использование и возврат символьных массивов из функций, возвращаемого типа или ссылки? - PullRequest
1 голос
/ 27 августа 2010

C ++: использование и возврат символьных массивов из функций, типа возвращаемого значения или ссылки?Я пытаюсь создать строку с нулевым символом в конце вне функции, а затем запустить функцию, которая назначит ей некоторые данные.Например, char abc [80] создается в main.Затем запускается input(), который возвращает пользовательский ввод в abc.Я полагаю, что есть два очевидных способа сделать это:

1.Сделайте так, чтобы функция ввода возвращала ввод в переменную main, что-то вроде:

char input ()
{
    char input [80];
    getline(cin, choice);
    return input;
}

int main ()
{
    char choice [80];
    choice = input ();
    ...
}

2.Передайте массив символов в функцию ввода моя ссылка, а затем поместите туда данные:

...
void input (&variable)
{
    getline(*variable, cin);
    return;
}
int main ()
{
    char choice [80];
    char* pointer;
    input (pointer);
    ...
}

Но я не могу заставить ни один из этих способов работать.Итак, что я делаю не так и как я могу это исправить?

Ответы [ 4 ]

7 голосов
/ 27 августа 2010

Просто используйте стандартные строки. Безумие использования массивов постоянной ширины вызвало, по крайней мере, у компании, на которой я работаю, четыре миллиарда долларов во время разработки. Правильный ответ на ваш вопрос может вас расстроить, но на самом деле это "НЕ ДЕЛАЙТЕ ЭТОГО !!!"

2 голосов
/ 27 августа 2010

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

std::string input()
{
    return std::string("return value");
}

int main()
{
    std::string myString = input();
}
0 голосов
/ 27 августа 2010

В примере 1 переменная ввода (я думаю, что вы имели в виду выбор) находится в стеке и исчезает, когда функция заканчивается, вы не можете безопасно использовать эту ячейку памяти в вызывающей функции.

InВ примере 2 вы передаете односимвольный указатель, чтобы получить то, что вы хотите, вам нужно передать указатель на массив выбора.

char ** pointer = choice;

и вы не захотите разыменовывать переменнуюв функции ввода getline ожидает двухсимвольный указатель.

На самом деле getn gnu ожидает 3 параметра, но, возможно, вы его не используете.

0 голосов
/ 27 августа 2010

Послушайте Ноа, но, к вашему сведению, вы делаете неправильно: вам нужно передать указатель на указатель (char** variable).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...