2012-02-07 5 views
2

나는이 작동하지 않는 이유를 알아 내기 위해 노력하고있어 :C에서 하위 문자열을 어떻게 할당합니까?

#include <stdio.h> 
int main() 
{ 
    char *orig = "Hey you guys."; 
    char *str; 
    str = &orig; 
    while(*str++) { 
    if (*str == 'y') 
     *str = '@'; 
    } 
    puts(orig); 
    return 0; 
} 
// OUTPUT => "Hey you guys." 
// Not "[email protected] @ou [email protected]" as expected. 

캐릭터 라인을 할당하여 = & 오리지널, 나는 STR은 오리지널과 동일한 메모리 주소를 공유하는 것이라고 생각했다. 내가 무엇이 누락 되었습니까?

답변

2

(1) str = orig을 수행하려는 메모리 공유를 위해 str이 이미 포인터 유형이므로.
(2) orig 리터럴 문자열, 일정한으로 정의된다 - 그래서 str을 통해 접속 할 때 도하지,"Hey you guys."을 수정할 수 없습니다, 그것은 런타임 오류가 발생합니다.

EDIT : 문제 3 : while 루프에서 포인터를 먼저 늘린 다음 'y'인지 확인하고 수정하십시오. 이렇게하면 첫 번째 요소이 누락됩니다. "yasdf""yasdf"이 아니며 "@asdf"이 아닙니다.

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char *orig = "Hey you guys."; 
    char buff[14]; //the length of orig + 1 byte for '\0' 
    char *str = buff; //since str and buff are already pointers 
    strcpy(str,orig); 
    while(*str) { 
    if (*str == 'y') 
     *str = '@'; 
    str++; 
    } 
    puts(buff); 
    return 0; 
} 
2

두 가지 :

  • &orig 포인터의 주소입니다. 아마도 str = orig을 원할 것입니다. 컴파일러가 여기에 포인터 유형 불일치에 대해 경고 했어야합니다. 그렇지 않은 경우 경고 수준을 올리십시오.
  • 상수 리터럴 문자열을 수정해도 항상 작동하지는 않습니다. 리터럴 문자열을 orig이라는 배열로 복사하고 안전하게 수정할 수있는 char orig[] = "Hey you guys."을 사용하십시오.
0
    [ strcpy 및 버퍼를 사용하여 일정한 메모리에 쓰기 방지하기] :이 따를 수

    당신이 후에 무엇을 달성하기 위해 [글쎄 ... 어쨌든 기대라고 생각]

  1. 당신은
  2. 리터럴 문자열을 변경할 수 없습니다 첫 번째 요소를 그리워
  3. 수정 된 코드 :
#include <stdio.h> 

int main() 
{ 
    char orig[] = "Hey you guys."; 
    char *str; 
    str = orig; 
    int i; 
    while(*str){ 
     if (*str == 'y') 
      *str = '@'; 
     *str++; 
    } 
    puts(str); 
    puts(orig); 
    return 0; 
} 
관련 문제