2013-08-06 1 views
3

쓰기 가능한 문자 배열에서 i 번째 문자 삭제 (첫 번째 인덱스는 0이고 두 번째 값은 1 등).C - 쓰기 가능한 문자 배열에서 i 번째 문자 삭제

void delete_char(char *str, int i) { 
    strcpy(str + i,str + i + 1); 
} 

우리가 함수 strcpy를 항상 오른쪽 위치로 왼쪽에서 문자를 복사 할 것이라는 점을 그 위에 셀 수 :이이 작업을 수행 할 수있는 합법적 인 방법이라고 생각합니까?

+1

strcpy()에 대한 문서는 무엇이라고 말합니까? -> "문자열이 겹치면 동작이 정의되지 않았습니다." –

답변

6

가 게시 된 코드는 strcpy()에서, 행동 보증되지 :

복사 바이트 문자열은 바이트 문자열에 SRC가 가리키는 이명 령에 의해 지적했다. 문자열이 겹치면 비헤이비어가 정의되지 않습니다. 또한 종료 널 바이트를 복사합니다.

memmove() null 종결자를 복사하는 작업을 수행하는 데 사용할 수 있습니다.

+0

@MitchWheat, 예, 그렇지만 답변이 아닌 메모로 게시했습니다. 나는 또한 가능한 해결책을 제시했다. – hmjd

3

당신은 또한 정의되지 않은 동작 피하기 위해 자신의 코드를 작성할 수 있습니다 : strcpy 문자열이 겹쳐있어 memmove는 아래와 같이 이용 될 수있는 경우에 처리 할 수없는 다른 답변을 수락

void delete_char(char *str, int i) { 
    int len = strlen(str); 

    for (; i < len - 1 ; i++) 
    { 
     str[i] = str[i+1]; 
    } 

    str[i] = '\0'; 
} 
+2

for 루프 (2 차 복잡성)에서'strlen'을 호출 할 이유가 없습니다. –

+0

@MattEckert that truble을 수정했습니다. –

+0

작동하지 않습니다. 마지막 문자가 반복됩니다. (코드에는 오타'srt'도 있습니다.) 그러나'strlen' *을 모두 호출 할 필요는 없습니다. * 실행하기 전에'i'를 검증 할 필요가 없다면'if (str [i]) do str [i] = str [++ i]; while (str [i]); ' – usr2564301

2

memmove(str+i, str+i+1, strlen(str) - i);