Як я можу зробити цикл для кожного символу рядка в C ++?
char
, Кодова точка Unicode, розширений кластер графеми?
index
частину відповідей.
Як я можу зробити цикл для кожного символу рядка в C ++?
char
, Кодова точка Unicode, розширений кластер графеми?
index
частину відповідей.
Відповіді:
Перебір з персонажами з std::string
, використовуючи діапазон на основі для циклу (це з C ++ 11, вже підтримується в останніх версіях GCC, гуркотом і 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
зі старомодним циклом:
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
, що є лише рядом байтів.
Цикл циклу може бути реалізований так:
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 string, а перша називається std string або (c ++ string). Я б запропонував використовувати рядок 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
}
//...........
}
String - це в основному масив символів, тому ви можете вказати індекс для отримання символу. Якщо ви не знаєте індексу, ви можете провести цикл через нього, як у наведеному вище коді, але коли ви робите порівняння, переконайтеся, що ви використовуєте одинарні лапки (яка визначає символ).
Крім цього, вищезгаданий код не пояснює себе.
ви можете отримати кожну табличку в рядку, використовуючи функцію 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
?