Я новичок в 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
std::string
имеет метод c_str()
который возвращает строку стиля C, которая представляет собой всего лишь массив символов.
Пример:
std::string myString = "Hello, World!";
const char *characters = myString.c_str();
c_str()
самом деле никак не связана с проблемой.
const char*
, а не char*
.
Ближайшая вещь к прямому переводу вашей функции:
string setString(string s) {
string arr;
for(int i = s.length() - 1; i >= 0; i--) {
arr.push_back(s[i]);
}
return arr;
}
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 элементов.
string arr[s.size() - 1];
???? !!!! Массив строк для хранения отдельных символов, правда?