2017-11-15 20 views
-1

문자열이있는 "prompt"문자열이 있습니다. 사용자는 공백을 구분 기호로 사용하여 수집 및 분리 한 문자열을 토큰 (토큰) char의 배열로 사용자 입력을 통해 프롬프트를 변경할 수 있어야합니다.C에서 문자열 배열의 단일 요소를 다른 문자열로 복사 할 수 없습니다.

예를 들어, 가정

char **tokens[2] = {"setprompt", "newprompt"}; 
char *prompt = "oldprompt"; 

if(strcmp(tokens[0], "setprompt") == 0) 
{ 
strcpy(prompt, tokens[1]); 
} 

strcmp() 기능이 완벽하게 잘 작동, 그것은 strcpy()에 도달 할 때, tokens[1]의 요소 (문자열 "newprompt" 인) 문자열 프롬프트에 복사되지 않습니다. 이것은 내 문제입니다.

대신 strncpy()을 사용하는 것 외에도 문제 해결을 시도했지만 각 변수/포인터에 대한 내 선언에 문제가 있다고 생각합니다. 어떤 도움이나 아이디어라도 좋을 것입니다.

참고 : 실제 프로그램에서 토큰 배열의 최종 크기는 2가 아닙니다.이 예는 간단히하기 위해 수정되었습니다. 감사!

char *prompt = "oldprompt"; 

그것은 일정한 메모리를 가리키는과 (가 정의되는 방식)을 수정할 수 없습니다 :

+0

컴파일러 경고를 사용합니다. 'char ** tokens [2] = { "setprompt", "newprompt"};'-> "경고 : 호환되지 않는 포인터 유형에서 초기화". – chux

+1

'char ** 토큰 [2] = ...'->'char * 토큰 [2] = ...'너무 많은'*'가 있습니다. [@Michael Dorgan] (https://stackoverflow.com/a/47297880/2410359)은 다른 문제에 대한 좋은 단서를 가지고 있습니다. – chux

답변

3

귀하의 문제는이 라인입니다. 읽기 전용으로두고 복사 및 수정 대신 자신의 버퍼를 만드는 것을 고려하십시오.

#define MAX_STRING_SIZE 255 

char *tokens[2] = {"setprompt", "newprompt"}; 
char *prompt = "oldprompt"; 
char myBuffer[MAX_STRING_SIZE]; 

strcpy(myBuffer, prompt); 

if(strcmp(tokens[0], "setprompt") == 0) 
{ 
    strcpy(myBuffer, tokens[1]); 
} 
+0

이 고양이를 다듬는 많은 방법. 나는 시작하기 쉽고 이해하기 쉬운 어떤 것으로 갔다. 충돌을 일으키는 복사본에 대해 런타임 오류가 발생하지 않았다는 것에 놀랐습니다. –

+0

'char ** tokens [2] = { "setprompt", "newprompt"};'[주석] (https://stackoverflow.com/questions/47297861/in-c-im-unable-to-copy- a 단일 문자 배열 (문자의 배열) # comment81548105_47297861). 이것은 잘못된 코드입니다. – chux

+1

예, 잘 잡습니다. –