Циклический просмотр символов 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);}
@ Робинсон: Это ошибочное предположение. Очень ошибочное предположение. Кроме того, «характер» имеет так много разных значений, лучше избегать этого термина.
Щенок
6
@Robinson: "std :: string - это UTF8 (предполагается) " С каких пор ?!
Гонки легкости на орбите
2
Ну, ладно, у него нет кодировки, однако, учитывая повсеместность utf8 сейчас (особенно в сети) и тот факт, что можно использовать единую согласованную кодировку для всего конвейера или приложения, в качестве основы для моего обсуждения мои std :: strings все utf8: с.
Робинсон
4
@Robinson: И все мои обрабатываются как не кодирующие, потому что я не программирую в пользовательской области (то есть, нет строк, предназначенных для визуализации людьми). Если вы хотите поговорить о кодировке символов, вам нужно поговорить о высокоуровневой абстракции поверх всегоstd::string , что является просто серией байтов.
Гонки легкости на орбите
1
Кроме того, случаи 2 и 3 являются хорошим примером того, где вы можете / должны использовать «авто»
галуа
29
Цикл 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 ++, очень простую в обращении.
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.
(Устаревший комментарий, который все еще, вероятно, актуален для OP :). Это не считается хорошей формой для использования strlenв условии цикла, поскольку для каждой итерации требуется операция O (n) над строкой, что делает весь цикл O (n). ^ 2) по размеру строки. strlenв цикле условие может быть вызвано, если строка изменяется во время цикла, но должно быть зарезервировано для случаев, когда это действительно требуется .
Магнус Хофф
@MagnusHoff: Да, Шлемель Художник снова поднимает свою уродливую голову.
Фред Ларсон
Я отредактировал свой ответ. Магнус, ты прав, упс использовал foreach в c # последние пару лет;)
demoncodemonkey
Тем не менее, вы все равно должны использовать strlen () вне цикла, предпочитая проверять нулевое значение в каждой итерации.
Маккензм
4
Я не вижу примеров использования диапазона, основанного на цикле с "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);}
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(unsignedint i =0; i < words.length(); i++){if(words.at(i)==' '){
spacecounter++;// to count all the spaces in a stringif(words.at(i +1)==' '){
i +=1;}
это только часть моего кода, но дело в том, что вы можете получить доступ к stringname.at(index)
std::string
?char
, Кодовая точка Unicode, расширенный кластер графем?index
роли в ответах.Ответы:
Циклический просмотр символов a
std::string
с использованием цикла for на основе диапазона (это из C ++ 11, уже поддерживается в последних выпусках GCC, clang и бета-версии VC11):Перебирая символы
std::string
с итераторами:Перебирая символы
std::string
со старомодным циклом for:Цикл по символам массива символов с нулевым символом в конце:
источник
std::string
, что является просто серией байтов.Цикл for может быть реализован так:
Это будет печатать строку символ за символом.
str[i]
возвращает символ в индексеi
.Если это массив символов:
В основном выше два - два типа строк, поддерживаемых c ++. Второй называется строкой c, а первый называется строкой std или (строкой c ++). Я бы предложил использовать строку c ++, очень простую в обращении.
источник
В современном C ++:
В C ++ 98/03:
Для итерации только для чтения, вы можете использовать
std::string::const_iterator
в C ++ 98 и /for (char const & c : s)
или простоfor (char c : s)
в C ++ 11.источник
auto
это всегда хорошая идея. При его использовании различие междуbegin()
иcbegin()
становится актуальным.char & c
)? Это просто для того, чтобы разрешить изменение значения символа в случае необходимости?Вот еще один способ сделать это, используя стандартный алгоритм.
источник
источник
strlen
в условии цикла, поскольку для каждой итерации требуется операция O (n) над строкой, что делает весь цикл O (n). ^ 2) по размеру строки.strlen
в цикле условие может быть вызвано, если строка изменяется во время цикла, но должно быть зарезервировано для случаев, когда это действительно требуется .Я не вижу примеров использования диапазона, основанного на цикле с "c строкой".
не связанный, но пример массива int
источник
Для C-string (
char []
) вы должны сделать что-то вроде этого:Для
std::string
вы можете использовать ,str.size()
чтобы получить его размер и итерацию , как пример, или можно использовать итератор:источник
Строка - это в основном массив символов, поэтому вы можете указать индекс для получения символа. Если вы не знаете индекс, вы можете просмотреть его, как в приведенном выше коде, но когда вы делаете сравнение, убедитесь, что вы используете одинарные кавычки (которые указывают символ).
Кроме того, приведенный выше код говорит сам за себя.
источник
Вы можете получить каждый символ в строке, используя функцию at библиотеки строк, как я сделал это так
это только часть моего кода, но дело в том, что вы можете получить доступ к
stringname.at(index)
источник