2009-09-25 2 views
4

내가 char* str; 인 경우 str을 허용하는 함수를 작성하고 함수가 반환 된 후에도 변경 사항이 유지되도록 str을 변경할 수 있습니까?전달 된 문자열을 영구적으로 변경하는 함수를 작성하는 방법

내가 무엇을 가지고 있습니다 :이 할 수있는 더 좋은 방법이

char *str = (char *) malloc(10); 
sprintf(str, "%s", "123456789"); 
//str points to 1 
move_ptr(&str); 
//str points to 2 

void move_ptr(char** str) 
{ 
    *str++; 
} 

가?

+2

주의 : 'str'포인터를 증가 시키면 할당 된 메모리에 핸들이 버려 지므로 메모리 누수가 발생합니다. –

+0

Johnathan은 누수보다 더 나쁘지 만 좋은 점을 만듭니다. * malloc * 메모리에있는 유일한 포인터를 증가시키고 ** 증가 된 값을 자유롭게하려고 시도하면 프로그램이 거의 충돌합니다. . – NVRAM

답변

14

는 그냥 함수 포인터를 통해 데이터에 액세스 :

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 

void change_string(char *str) 
{ 
    size_t i; 

    /* As an example, make it all upper case. */ 
    for(i = 0; str[i]; ++i) 
    str[i] = toupper(str[i]); 
} 

int main(void) 
{ 
    char buffer[32]; 
    char *str = buffer; 

    strcpy(str, "test string"); 
    change_string(str); 
    printf("it's now %s\n", str); 

    return EXIT_SUCCESS; 
} 

이 생각하는 자, 당신은 표준 strcpy() 기능을 정확히 설명하는 범주의 것을 알 수 있습니다. C에서 매우 일반적인 작업입니다.

UPDATED : 데이터가 아니라 포인터 자체를 변경하는 방법에 대한 의문이 크게 제기되었습니다. 아마 이것이 모두 함께 의미 였지만 나는 이해하지 못했습니다.

문제의 해결책은 괜찮지 만, 개인적으로 가능하면 내가, 반환 값으로 작업하는 것이 더 편리 찾을 :

char * change_pointer(char *str) 
{ 
    return str + 1; 
} 

int main(void) 
{ 
    char *str = "test string"; 

    printf("now '%s'\n", str); 
    str = change_pointer(str); 
    printf("now '%s'\n", str); 
    return EXIT_SUCCESS; 
} 

포인터 (들)도 const -declared 일 과정의 수와 이어야합니다. 버퍼링 된 텍스트를 변경하지 않아도됩니다.

+0

str에서 str이 가리키는 위치를 변경하려면 어떻게해야합니까? char ** str을 param으로 취한 다음 str을 & str로 전달하는 함수를 사용해야합니까? – user105033

+0

@unknown : 그건 다른 질문처럼 들리지만 ... 물론 그것은 그것을 해결하는 한 가지 방법입니다. 가능한 경우 반환 값을 사용하여 함수가 업데이트 된 문자열 포인터를 반환하도록하는 것이 좋습니다. – unwind

2

는 질문 포인터 포인트가 데이터를 읽기 전용으로 경우가 가리키는 것을 변경할 수 없습니다

을 변경했습니다.

하나 "마흔둘"는 읽기 전용 데이터이다

char *data = "forty two"; 

것을 쓸 때; data 포인터가 직접 또는 함수 호출을 통해 가리키는 대상을 변경할 수 없습니다.

대신 리터럴 상수에 대한 포인터를 할당하는 리터럴 상수에서 초기화 '문자열을'얻을 배열로 문자를 복사하려면 이제 데이터는 10 개 문자의 배열 (9입니다

char data[] = "forty two"; 

글자와 공백 + NUL 터미네이터의 경우 1)을 변경할 수 있습니다.

0

예제가 단순 해 보일 수도 있지만 다음과 같은 경우에 유용 할 수 있습니다. 메모리 누출 때문에 조심하십시오. 함수 호출 후에 더 이상 할당 한 원래 메모리의 일부를 가리키는 포인터가 없습니다.

unwind으로 언급했듯이 새로운 포인터를 반환하는 것이 더 나은 선택 일 수 있습니다. 동일한 목표를 달성하는 동안 메모리를 해제 할 목적으로 원래 포인터를 유지해야하는 것이 더 분명합니다. 카운터 인수는 반환 값을 가져 오면 원래 포인터를 해제 할 수 있다는 인상을 주지만, 동일한 메모리 블록의 두 지점 (다른 위치)을 가리 키기 때문에 수행 할 수 없습니다.

+0

그냥 누설보다 나쁜데, ** free() **를 호출하면 by_ ** malloc() **이 반환하지 않는 _any 값이 거의 확실하게 충돌을 일으킬 것입니다. – NVRAM

관련 문제