Возврат и печать строк в C ++ - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь получить путь к файлу от пользователя в функции getPath () и вернуть путь в виде строки. У меня проблемы, потому что компилятор говорит, что мне нужно использовать const char, и я не знаю, как это сделать. Как бы я использовал константные символы, и что они еще. Также, как мне распечатать их на консоли, как в основной функции.

#include <iostream>
#include <stdio.h>
#include <string.h>

  char getPath() {
     char path[64];
     std::cout << "Input File Name For Debugging:";
     gets(path);
     std::cout << "Debugging: ";
     puts(path);
     return path[64];
 }

int main(){
    char path[64];
    int pathlen = strlen(reinterpret_cast<const char *>(path));
    //suppost to print the char array
    for(int i; i < pathlen; i++){
        std::cout << path[i];
    }
     return 0;
 }

1 Ответ

1 голос
/ 08 апреля 2020

Много недоразумений

1) char не строка, это символ

2) Массив символов (например, char [64]) не является строкой, его массив. Он может содержать строку, но это немного другая идея

3) Вы не используете [64], когда имеете в виду весь массив, поэтому return path[64]; не является правильным способом возврата строки.

4) Не смешивайте ввод-вывод C ++ (std::cin, std::cout) с C I / O (puts, gets), он не работает надежно, придерживайтесь C ++ Ввод / вывод, поэтому

 std::cout << "Debugging: " << path << '\n';

не

 std::cout << "Debugging: ";
 puts(path);

5) Вы никогда не вызываете свою функцию getPath, поэтому, конечно, она не выполняет

6) Вы не инициализируйте переменную l oop i в конечном l oop, чтобы она не имела предсказуемого значения. Вы должны инициализировать i в 0

for(int i; i < pathlen; i++){
     std::cout << path[i];

должно быть

for(int i = 0; i < pathlen; i++){
     std::cout << path[i];

Поскольку вы можете видеть множество ошибок для очень короткой программы. Я собираюсь показать два разных правильных способа написания этой программы.

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

Первый способ - использовать массив символов для хранения строки. Но массивы имеют серьезные проблемы в C ++. В частности, невозможно вернуть массив из функции, поэтому приведенный выше код никогда не будет работать, даже если вы исправите все мелкие проблемы. То, как вы получаете C ++ для «возврата» массива, немного любопытно, и я не собираюсь объяснять это должным образом (вам нужно прочитать хорошую книгу по C ++). Что вы делаете, это объявляете массив в вызывающей функции и передаете массив в качестве параметра. Вот ваша программа, написанная с использованием этой техники (и исправленная для всех других проблем).

#include <iostream>

void getPath(char path[], int n) {
     std::cout << "Input File Name For Debugging:";
     std::cin.getline(path, n);
     std::cout << "Debugging: " << path << '\n';
}

int main(){
    char path[64];
    getPath(path, 64);
    std::cout << path << '\n';
    return 0;
}

Примечание. Я использую getline для чтения строки, что является одним из способов чтения строки в C ++. getline требует, чтобы вы передали размер массива, в который он будет считываться, поэтому я передал это getPath, а также сам массив.

Теперь для простоты. C ++ имеет свой собственный строковый тип , называемый std::string. Вам не нужно использовать хитрые массивы вообще. И строковый тип C ++ может быть возвращен из функции обычным способом. Это делает код более естественным. Чтобы использовать строковый тип C ++, все, что вам нужно сделать, это #include <string>. Вот ваша программа, переписанная для использования строкового типа C ++

#include <iostream>
#include <string>

std::string getPath() {
     std::cout << "Input File Name For Debugging:";
     std::string path;
     std::getline(std::cin, path);
     std::cout << "Debugging: " << path << '\n';
     return path;
}

int main(){
    std::string path;
    path = getPath();
    std::cout << path << '\n';
    return 0;
}

Обратите внимание, что эта вторая программа ближе к вашему исходному коду, getPath имеет тип возврата, только это std::string не char, и это имеет оператор return для возврата пути. Именно так вы должны писать этот код, строковый тип C ++ значительно облегчит написание строкового кода.

...