코딩을 처음 접했고 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
-
답변 # 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 ++에서 가장 일반적으로 사용되는 라이브러리 중 하나입니다. 실제로 표준으로 들어가는 것은 부스트에서 비롯됩니다.
관련 자료
- r - 문자열을 여러 열로 분할 (특정 순서 사용)
- scala - 문자열 분할을위한 정규식 패턴을 수정하는 방법
- arrays - 문자열을 분할하면서 요소에 액세스
- amazon redshift - 행을 쉼표로 구분 된 단일 문자열로 피벗하는 방법
- 줄 바꿈으로 구분 된 문자열 목록을 RegEx를 사용하여 대괄호로 묶인 한 줄에 모두 쉼표로 구분 된 목록으로 변환합니다
- int를 PHP에서 쉼표로 구분 된 문자열로 변환하는 방법은 무엇입니까?
- r - 간격에 따라 문자열 분할
- 배치 파일에서 쉼표로 구분 된 문자열을 통해 루프 스루 그
- python - 데이터 프레임에서 문자열 분할
- python - 문자가 포함 된 문자열 분할
- node.js - JavaScript 및 NodeJS를 사용하여 쉼표로 구분 된 문자열에서 배열의 빈 객체를 피하는 방법은 무엇입니까?
- c - 쉼표로 구분 된 문자열을 파일에 쓰거나 읽을 수 없습니다
- javascript - 개체의 새 속성에 쉼표로 구분 된 문자열 푸시
- python - Pandas 시리즈의 '_'로 구분 된 문자열을 가변 개수의 필드로 분할하여 누락 된 필드를 채 웁니다
- regex - 문자열에서 점으로 구분 된 단어 찾기
- javascript - n 문자마다 여러 줄 문자열 분할
- javascript - 쉼표로 구분 된 숫자 문자열을 정수로 변환하는 방법은 무엇입니까?
- android - Java에서 쉼표로 구분 된 숫자를 포함하는 문자열을 정수로 변환하는 방법은 무엇입니까?
- python - 공백으로 구분 된 정수 문자열로 목록 정렬
- regex - rewriterule 수정 - 하이픈으로 구분 된 문자열 끝에있는 id에 액세스
- c++ - const uint8_t []를 std - : string으로 변환하는 방법?
- javascript - 이 JSON이 아닌 문자열을 객체 배열로 변환하는 방법은 무엇입니까?
- 배열 키를 PHP Laravel에서 임의의 문자열로 변환하는 방법
- Java의 배열에서 전체 문자열을 다른 문자열로 바꾸는 방법
- java - 특정 인덱스의 배열에 액세스
- c++ - 포인터 마이너스 포인터 배열 및 변수
- c++ - 입력 문자열에서 2D 벡터를 만드는 방법은 무엇입니까?
- java - 비밀번호 유효성 검사에서 특수 문자를 사용하지 않는 방법은 무엇입니까?
- C ++에서 2D 배열은 2D 배열처럼 작동하는 1D 배열보다 전체 작업에서 더 느립니까?
- C ++에서 다차원 char 배열의 값을 변경할 수없는 이유는 무엇입니까?
strtok ()의 올바른 사용법은 다음과 같습니다.