Для каждого символа в строке
Как бы я сделал цикл для каждого символа в строке в C++?
10 ответов
Перебирая символы
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
со старомодным циклом: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); }
Цикл 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.
Вот еще один способ сделать это, используя стандартный алгоритм.
#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....
}
Я не вижу примеров использования диапазона, основанного на цикле с "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
}
//...........
}
Строка - это в основном массив символов, поэтому вы можете указать индекс для получения символа. Если вы не знаете индекс, вы можете просмотреть его, как в приведенном выше коде, но когда вы проводите сравнение, убедитесь, что вы используете одинарные кавычки (в которых указан символ).
Кроме того, приведенный выше код говорит сам за себя.
Вы можете использовать метод size() для получения длины строки и оператор квадратной скобки для доступа к каждому отдельному символу.
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int length = s.size();
for(int i = 0; i < length; i++)
{
process(s[i]);
}
}
Для C-строки (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;
}
Вы можете получить каждый символ в строке, используя функцию 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)