Создание массива из строки

0

Я новичок в C++, и я столкнулся с проблемой... Я не могу создать массив символов из строки, используя цикл for. Например, в JavaScript вы должны написать что-то вроде этого:

var arr = [];
function setString(s) {
    for(var i = s.length - 1; i >= 0; i--) {
       arr.push(s[i]);
    }
    return arr.join("");
}

setString("Hello World!"); //Returns !dlroW olleH

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

Есть ли способ, которым я мог бы сделать это в C++ с использованием массивов? Могу ли я объединить элементы массива в одну строку, как в JavaScript?

Было бы очень признательно, если бы вы могли помочь. Заранее спасибо. Если кому-то нужна дополнительная информация, просто скажите мне, и я отредактирую сообщение.

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

function setString(s) {
    string arr[s.size() - 1];
    for(int i = s.size() - 1; i >= 0; i--) {
        arr[i] = s.at(i); //This is where I get stuck at... 
    //I don't know if I'm doing something wrong or not.
    }
}

Было бы неплохо, если бы кто-то сказал мне, что я делаю неправильно или что мне нужно вынести из кода. Это консольное приложение, скомпилированное в Code :: Blocks

  • 2
    Вы делаете это как учебное упражнение? Потому что если нет, то это может быть проблемой XY - маловероятно, что таким способом будет полезно вручную создать массив символов из строки. Что ты на самом деле пытаешься сделать?
  • 0
    string arr[s.size() - 1]; ???? !!!! Массив строк для хранения отдельных символов, правда?
Теги:
string
arrays

3 ответа

3
Лучший ответ

std::string имеет метод c_str() который возвращает строку стиля C, которая представляет собой всего лишь массив символов.

Пример:

std::string myString = "Hello, World!";
const char *characters = myString.c_str();
  • 0
    Я думаю, что вы неправильно поняли вопрос (это довольно непонятно). Желаемым выводом является перевернутая строка, c_str() самом деле никак не связана с проблемой.
  • 0
    c_str () возвращает const char* , а не char* .
1

Ближайшая вещь к прямому переводу вашей функции:

string setString(string s) {
    string arr;
    for(int i = s.length() - 1; i >= 0; i--) {
        arr.push_back(s[i]);
    }
    return arr;
}
1

std::string представляет собой динамический массив под довольно тонкой оболочкой. Нет необходимости копировать символ по символу, так как он сделает это правильно для вас:

Если массив символов заканчивается на нуль (то есть последний элемент равен '\0'):

const char* c = "Hello, world!"; // '\0' is implicit for string literals
std::string s = c; // this will copy the entire string - no need for your loop

Если массив символов не заканчивается на нуль:

char c[4] = {'a', 'b', 'c', 'd'}; // creates a character array that will not work with cstdlib string functions (e.g. strlen)
std::string s(c, 4); // copies 4 characters from c into s - again, no need for your loop

Если вы не можете использовать std::string (например, если вы вынуждены использовать ANSI C):

const char* c = "Hello, World!";
// assume c2 is already properly allocated to strlen(c) + 1 and initialized to all zeros 
strcpy(c2, c);

В примере javascript вы меняете строку, что можно сделать достаточно легко:

std::string s = "Hello, world!";
std::string s1(s.rbegin(), s.rend());

Кроме того, вы можете сократить свои итерации пополам (для C++ и Javascript), если вы исправите свой цикл (псевдокод ниже):

string s = "Hello, world!"
for i = 0 to s.Length / 2
    char t = s[i]
    s[i] = s[s.Length - 1 - t]
    s[s.Length - 1 - i] = t

Который заменит концы строки, чтобы отменить ее. Вместо того, чтобы перебирать N элементов, вы пропускаете максимум N/2 элементов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню