Как бы я сделал цикл для каждого символа в строке в 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
?