Как бы я сделал цикл для каждого символа в строке в C ++?
char, Кодовая точка Unicode, расширенный кластер графем?
indexроли в ответах.
Как бы я сделал цикл для каждого символа в строке в C ++?
char, Кодовая точка Unicode, расширенный кластер графем?
indexроли в ответах.
Ответы:
Циклический просмотр символов a std::stringс использованием цикла for на основе диапазона (это из C ++ 11, уже поддерживается в последних выпусках GCC, clang и бета-версии VC11):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}Перебирая символы std::stringс итераторами:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}Перебирая символы std::stringсо старомодным циклом for:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}Цикл по символам массива символов с нулевым символом в конце:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}std::string , что является просто серией байтов.
Цикл for может быть реализован так:
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
Это будет печатать строку символ за символом. str[i]возвращает символ в индексе i.
Если это массив символов:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
В основном выше два - два типа строк, поддерживаемых c ++. Второй называется строкой c, а первый называется строкой std или (строкой c ++). Я бы предложил использовать строку c ++, очень простую в обращении.
В современном C ++:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
В C ++ 98/03:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
Для итерации только для чтения, вы можете использовать std::string::const_iteratorв C ++ 98 и / for (char const & c : s)или просто for (char c : s)в C ++ 11.
autoэто всегда хорошая идея. При его использовании различие между begin()и cbegin()становится актуальным.
char & c)? Это просто для того, чтобы разрешить изменение значения символа в случае необходимости?
Вот еще один способ сделать это, используя стандартный алгоритм.
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string name = "some string";
std::for_each(name.begin(), name.end(), [] (char c) {
std::cout << c;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
strlenв условии цикла, поскольку для каждой итерации требуется операция O (n) над строкой, что делает весь цикл O (n). ^ 2) по размеру строки. strlenв цикле условие может быть вызвано, если строка изменяется во время цикла, но должно быть зарезервировано для случаев, когда это действительно требуется .
Я не вижу примеров использования диапазона, основанного на цикле с "c строкой".
char cs[] = "This is a c string\u0031 \x32 3";
// range based for loop does not print '\n'
for (char& c : cs) {
printf("%c", c);
}
не связанный, но пример массива int
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
Для C-string ( char []) вы должны сделать что-то вроде этого:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
Для std::stringвы можете использовать , str.size()чтобы получить его размер и итерацию , как пример, или можно использовать итератор:
std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
char c = *it;
}
for (int x = 0; x < yourString.size();x++){
if (yourString[x] == 'a'){
//Do Something
}
if (yourString[x] == 'b'){
//Do Something
}
if (yourString[x] == 'c'){
//Do Something
}
//...........
}
Строка - это в основном массив символов, поэтому вы можете указать индекс для получения символа. Если вы не знаете индекс, вы можете просмотреть его, как в приведенном выше коде, но когда вы делаете сравнение, убедитесь, что вы используете одинарные кавычки (которые указывают символ).
Кроме того, приведенный выше код говорит сам за себя.
Вы можете получить каждый символ в строке, используя функцию at библиотеки строк, как я сделал это так
string words;
for (unsigned int i = 0; i < words.length(); i++)
{
if (words.at(i) == ' ')
{
spacecounter++; // to count all the spaces in a string
if (words.at(i + 1) == ' ')
{
i += 1;
}
это только часть моего кода, но дело в том, что вы можете получить доступ к stringname.at(index)
std::string?