>

코딩을 처음 접했고 C ++에서 문자열을 분할하는 데 문제가 있습니다. const char names[] (i.e. "Mary, Jan, Jane") 로 입력되는 문자열을 나누는 방법을 알고 싶습니다.  외부 라이브러리를 사용하지 않고 C ++에서 (즉, #include <string> 를 사용하고 싶지 않습니다.  등- #include <cstring> 를 사용할 수 있지만 ).

나는 다음을 사용하려고 시도했다 :

const char names[] = "Mary, Jan, Jane";
char *token = strtok(names, ",");
while (token != NULL) {
    token = strtok(NULL, " ");
}

그러나 const 배열의 문자를 전달할 수 없으며 모든 개별 "토큰"에 액세스하는 방법을 알고 싶습니다.

또한 입력을 char names[] 로 변경하려고했습니다.  (그러나 const 인 입력이 필요합니다.) 세그멘테이션 오류가 발생하여 이유를 이해할 수 없습니다.


  • 답변 # 1

    strtok ()의 ​​올바른 사용법은 다음과 같습니다.

    int main ()
        {
          char str[] ="Mary, Jan, Jane";
          char * pch;
          pch = strtok (str," ,");
          while (pch != NULL)
          {
            printf ("%s\n",pch);
            pch = strtok (NULL, " , ");
          }
          return 0;
        }
    
    

  • 답변 # 2

    strtok  입력 문자열을 수정합니다. 문자열은 char* 로 전달됩니다. const char* 가 아니라 . '\0' 로 구분자를 대체합니다. . 이것은 const char* 인 문자열 리터럴과 호환되지 않습니다. .

    이 함수는 내부 상태를 유지하기 때문에 절대 사용하지 않을 것입니다. 여러 스레드에서 사용할 수 없거나 strtok 를 사용하는 다른 함수를 호출 할 수도 있습니다.   strtok 를 사용하는 함수에있는 동안 .

    C ++에서 문자열을 분리하는 몇 가지 (실제로) 방법을 보려면이 Q/A를 살펴보십시오.
    문자열의 단어를 반복하는 가장 우아한 방법

  • 답변 # 3

    char 배열 대신 std :: string을 사용하고 std :: stringstream 클래스를 사용하십시오. , 를 통과  std :: getline 함수의 구분자 :

    #include <iostream>
    #include <string>
    #include <sstream>
    int main() {
        std::string names = "Mary, Jan, Jane";
        std::string temp;
        std::istringstream ss(names);
        while (std::getline(ss, temp, ',')) {
            std::cout << temp << '\n';
        }
    }
    
    

    남은 유일한 것은 각 문자열에서 선행 공백 문자를 처리하는 것입니다 :

    if (temp.front() == ' ') {
        temp.erase(0, 1);
    }
    
    

  • 답변 # 4

    내가 선호하는 방법은 boost :: algorithm :: split

    http://www.boost.org/doc/libs/1_63_0/doc/html/string_algo/usage.html#idp11326066

    c 문자열을 기대하는 C 함수 인 strtok보다 안전합니다.

    std :: string과 std :: vector와 같은 컨테이너를 사용해야합니다.

    사용하고 싶지 않다고 언급

    #include <string>
    
    

    질문 : 왜 안돼? C ++로 프로그래밍하려는 경우 std :: string에 익숙하고 STL이 필수적입니다.

    코딩을 처음 접한다면 부스트에 익숙하지 않을 수도 있지만 C ++에서 가장 일반적으로 사용되는 라이브러리 중 하나입니다. 실제로 표준으로 들어가는 것은 부스트에서 비롯됩니다.

  • 이전 python - 빅 데이터 세트의 데이터 재구성
  • 다음 c# - 쿼리에서 반환 목록