문자열의 모든 문자에 대해


229

C ++에서 문자열의 모든 문자에 대해 for 루프를 어떻게 수행합니까?


9
어떤 종류의 줄? C- 문자열 또는 std::string?
신비주의

:: 나는 표준 있으리라 믿고있어, 그래서 텍스트 파일에서 읽을 것
잭 Wilsdon을

4
어떤 캐릭터? char, 유니 코드 코드 포인트, 확장 된 grapheme 클러스터?
Philipp

의 가능한 중복 내가 문자열을 통해 반복하고 또한 인덱스 (현재 위치)를 알 수 있습니까? . index답변 부분에 대해 걱정하지 마십시오 .
jww

답변:


417
  1. 관통 반복 문자 (A)의 std::string사용 범위 기반 루프 (이미 GCC, 그 소리의 최근 릴리스에서 지원, C ++에서 11의, 그리고 VC11 베타)에 대한 :

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
  2. std::string반복자 를 사용하여 a의 문자를 반복 합니다.

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
  3. std::string구식 for 루프를 사용하여의 문자를 반복합니다.

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
  4. 널 종료 문자 배열의 문자를 반복합니다.

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }

4
@Robinson : 잘못된 가정입니다. 매우 잘못된 가정. 또한 "문자"는 여러 가지 의미를 지니고 있으므로이 용어를 엄격하게 피하는 것이 가장 좋습니다.
강아지

6
@Robinson : "std :: string은 UTF8입니다 (가정) "언제부터?!
궤도에서 가벼움 경주

2
글쎄, 지금은 인코딩이 없지만 현재 utf8의 유비쿼터스 (특히 웹)와 파이프 라인 또는 애플리케이션 전체에서 단일 std :: strings 모두 utf8 : p입니다.
Robinson

4
@Robinson : 그리고 사용자 지향 도메인에서 프로그래밍하지 않기 때문에 (즉, 사람에게 렌더링 될 문자열이 없기 때문에) 모든 인코딩이 필요 없습니다. 문자 인코딩에 대해 이야기하고 싶다면 일련의 바이트 인 최상위에 대한 상위 수준 추상화 대해 이야기해야 std::string합니다.
궤도에서 가벼움 레이스

1
또한 사례 2와 사례 3은 "자동"을 사용할 수있는 곳의 좋은 예입니다.
galois

29

for 루프는 다음과 같이 구현 될 수 있습니다 :

string str("HELLO");
for (int i = 0; i < str.size(); i++){
    cout << str[i];
}

문자열을 문자별로 인쇄합니다. str[i]index에서 문자를 반환합니다 i.

문자 배열 인 경우 :

char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
    cout << str[i];
}

기본적으로 위 두 가지는 c ++에서 지원하는 두 가지 유형의 문자열입니다. 두 번째는 c 문자열이라고하고 첫 번째는 std 문자열 또는 (c ++ 문자열)이라고합니다. 처리하기 쉬운 c ++ 문자열을 사용하는 것이 좋습니다.


24

현대 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_iteratorC ++ 98 for (char const & c : s)또는 for (char c : s)C ++ 11 에서만 사용할 수 있습니다 .


여기에 일부 C와 컴파일러를위한 몇 가지 옵션 ++ 11 지원의 : pastebin.com/LBULsn76
벤자민 린

@ BenjaminLindley : 감사합니다! auto항상 좋은 생각입니다. 그것을 사용할 때, 구별 begin()cbegin()관련이 있습니다.
Kerrek SB

2
char에서 참조의 역할은 무엇 char & c입니까? 필요한 경우 문자 값을 수정할 수 있습니까?
LunaticSoul

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;
   });
}

우리는 2018 년을 가지고 있으므로 이것이 정답이어야합니다.
rwst

7
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}

4
(오래된 의견, 여전히 OP와 관련이 있습니다 :) strlen루프 조건에서 사용하기 에 좋은 형태로 간주되지 않습니다. 각 반복마다 문자열에서 O (n) 연산이 필요하므로 전체 루프 O (n ^ 2) 문자열의 크기. strlen루프 중에 문자열이 변경되면 루프 조건에서 호출 할 수 있지만 실제로 필요한 경우에는 예약해야 합니다 .
Magnus Hoff

@ MagnusHoff : 응, 화가 Schlemiel은 못생긴 머리를 다시 양육 합니다.
Fred Larson

내 답변을 편집했습니다. Magnus 당신 말이 맞아, 죄송합니다 지난 몇 년 동안 C #에서 foreach를 사용했습니다;)
demoncodemonkey

그러나 모든 반복에서 null을 테스트하는 것보다 루프 외부에서 strlen ()을 계속 사용해야합니다.
mckenzm

4

"c 문자열"과 함께 for 루프 기반 범위를 사용하는 예는 없습니다.

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);
}

1

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;
}

1
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
        }
        //...........
    }

문자열은 기본적으로 문자 배열이므로 문자를 가져 오기 위해 색인을 지정할 수 있습니다. 인덱스를 모르는 경우 위의 코드와 같이 인덱스를 반복 할 수 있지만 비교할 때는 작은 따옴표 (문자를 지정)를 사용해야합니다.

그 외에는 위의 코드가 자명하다.


-1

문자열 라이브러리의 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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.