2014-01-22 3 views
0

나는 이것이 가장 쉬운 질문이지만, 왜 내가이 쑤시개를 조작 할 수 없는지 알아 내려고 애쓰는 데 어려움을 겪고있다. . 그래서 예를 들면 다음과 같습니다 :가리키는 문자열을 조작하는 방법

내가 원하는 것은 'str1'이 가리키는 문자열을 조작하는 것입니다. 예를 들어 아래에 표시된 것처럼 문자열을 출력하고 원본을 볼 수 있습니다. 그럼 거기에 null 문자를 추가하고 단축 할 수 있습니다.

cout << str1 << '\n'; 
str1[5] = '\0'; 
cout << str1; 

나는 또한 시도했다 : 나는 이런 식으로 뭔가를 볼 수 바라고 있어요

cout << str1 << '\n'; 
*(str1+4) = '\0'; 
cout << str1; 

어느 쪽이든은 :

Hello World 
Hello 

내가 두 경우 모두지고있어 오류가 때입니다 문자열을 변경하려고합니다. str1을 배열 (char str1[] = ....)로 선언하는 것이 더 쉬울 것이라는 것을 알았지 만, 두려워하게 사용하는 데 제약이 있습니다.

+3

문자열 리터럴을 수정할 수 없습니다. 다행히도'char *'에 대한 할당은 C++ 11에서 더 이상 사용되지 않습니다. – juanchopanza

답변

4

문자열 리터럴은 읽기 전용 메모리에 저장됩니다. 그것들은 수정할 수 없습니다. 사실 현대 C++에서 str1을 초기화하려고 시도하면 오류가 발생합니다. 그것은 const char*해야한다 : 이것은 분명히 당신이 char의 수정되어서는 안된다는하게

const char* str1 = "Hello World"; 

. 당신은 당신이 조작 할 수있는 문자열의 사본을 원하는 경우

, 당신은 str1을 배열해야한다 : 당신이 리터럴 문자열 배열을 초기화 할 때

char str1[] = "Hello World"; 

를 문자 배열에 복사됩니다.

+0

답변 해 주셔서 감사합니다! 그래서, str1의 편집 가능한 복사본을 char *로 정의했다면 저장할 방법이 없다는 뜻입니까? – TrapLevel

+0

@TrapLevel 물론 문자를 문자열 리터럴에서 배열로 복사해야합니다. 그것이 제가 한 두 번째 줄은 자동으로 수행되지만 수동으로 할 수 있습니다. –

-1

str1을 변경할 수없는 이유는 Joseph이 (가) 적절하게 설명해주었습니다. 그러나 여전히 수정하려는 경우 다음과 같이 사용할 수 있습니다.

char *str = "hello"; 
char *ptr = new char[strlen(str)+1]; 
strcpy(ptr,str); 
ptr[2] = 'd'; 
str = ptr; 

이 문제가 해결되기를 바랍니다.

+1

'ptr'는'strcpy'를 호출 한 후에 이미 널 문자로 종료됩니다. – dreamlax

+0

또한이 방법을 사용하는 경우 'delete'를 사용해야합니다. – dreamlax

+0

대부분의 코드는 strdup()를 호출하는 단일 행으로 대체 될 수 있으며 질문에 대답하지 않습니다.-1 – EJP

0

여러분 모두에게 도움을 요청한 후에는 먼저 문자열의 길이를 결정하고 같은 크기의 배열을 초기화 한 다음 원래의 배열을 반복하여 배열에 저장했습니다 . 그 때 나는 기쁘게도 그것을 조작 할 수 있었다.

int someFunc(char *inpStr){ 
    int counter = 0; 

    //Find the length of the input string 
    while(inpStr[counter]!='\0'){counter++;} 

    //Input initialize an array of same size 
    char strArray[counter+1]; 

    //Copy whats in the char * to the array and make sure it ends with null 
    for(int i=0;i<=counter;i++){strArray[i]=*(inpStr+i);} 
    strArray[counter]='\0'; 

    ..... 
return 0; 
} 

감사합니다.

관련 문제