C ++, функция для возврата массива в виде строки - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в C ++ и пытаюсь создать функцию, которая принимает массив чисел и преобразует эти числа в символ ASCII, то есть int в строку. Когда я пытаюсь вывести строку, я получаю случайные символы. Я искал учебные пособия, и было предложено добавить терминатор строки, что я и сделал, но, похоже, это не исправить, и я не могу найти ответ, который бы решил эту проблему.

т.е. Я хочу, чтобы код ниже напечатал «Hello».

#include <iostream>
#include <string>

char* intToString(int* array, int size)
{
    char string[size + 1];
    string[size] = '\0';
    for (int i = 0; i <= size; i++)
        string[i] = array[i];

    return string;
}


int main()
{
    int my_array[5] = {72, 101, 108, 108, 111};
    int size = 5;
    std::cout << intToString(my_array, size);

    return 0;
}

Ответы [ 5 ]

0 голосов
/ 26 апреля 2018

Ваш код не должен даже компилироваться, потому что size + 1 не является значением постоянной времени компиляции, изменяя строку

char string[size+1];

до

char string*=new char[size+1]

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

Так что это хорошая идея, чтобы изменить

std::cout << intToString(my_array, size);

К

char *string=intToString(my_array, size);
std::cout << string;
delete[] string;

Хотя обратите внимание, что ответы других верны, что вы должны использовать std :: string и std :: vector вместо массивов и массивов символов в целом, что вы сейчас делаете - это смешиваете c с c ++.

0 голосов
/ 26 апреля 2018

В C ++ 11 std::to_string предпочтительнее. Если вам нужна функция преобразователя для более чем одного типа и / или контейнера данных, вы можете использовать функцию шаблона, подобную этой

#include <iostream>
#include <string>
#include <vector>
#include <array>

template <typename T>
std::string toString(const T & items) {
    std::string str;
    for (const auto & item : items) {
        str += std::to_string(item);
    }

    return str;
}


int main() {
    const std::vector<int> my_vector {102, 101, 108, 108, 111};
    std::cout << toString(my_vector);


    std::cout << std::endl;

    const std::array<double,5> my_array {102, 101, 108, 108.5, 111.0};
    std::cout << toString(my_array);
    return 0;
}
0 голосов
/ 26 апреля 2018

Все еще существует проблема в обновленном решении, которое вы написали.

  • Вы все равно должны объявить массив string с size+1 и сделать последний элемент как \0.
  • Или вы можете использовать std::string.

Вот C ++ способ сделать это, его можно еще сократить, но это настолько близко, насколько это возможно к вашему коду.

#include <iostream>
#include <string>
#include <vector>

std::string intToString(const std::vector<int>& vec)
{
    std::string ans;
    for (auto& each : vec)
        ans += char(each);
    return ans;
}


int main()
{
    std::vector<int> vec{72, 101, 108, 108, 111};
    std::cout << intToString(vec);
    return 0;
}
0 голосов
/ 26 апреля 2018

Как можно ближе к вашей первоначальной попытке:

#include <iostream>
#include <string>
std::string intToString(int my_array[], int size)
{
    // just declare a variable of type std::string instead of char string[size+1]
    // there's no need to define a size as this std::string will grow dynamically
    // there's also no need to add a delimiter as std::string takes 
    // care of this itself
    std::string string;
    for (int i = 0; i < size; i++) {
        // this appends an integer representing an (ASCII) codepoint 
        // to an initially empty std::string
        string += my_array[i];
        // this won't work as string is initially empty
        // so you can't access the element at index 0 
        // string[i] = my_array[i];
    }
    return string;
}
int main()
{
    const int size = 5;
    int my_array[] = { 72, 101, 108, 108, 111 };
    std::cout << intToString(my_array, size) << std::endl;
    return 0;
}

Обратите внимание на различия в вашем решении, указанные в комментариях.

0 голосов
/ 26 апреля 2018

char * не является строкой. Это указатель на char. В вашем случае вы получаете случайные символы, потому что вы возвращаете указатель на локальный string, который уничтожается после вызова. Используйте std::string или, если вы хотите так много массивов, вы можете получить правильную семантику копирования из std::array.

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