2014-01-10 2 views
-1

사용자가 프로그램에서 번호를 부여한 문자를 삭제하고 싶지만 다음 코드를 삭제합니다. 내 코드에서 0이 계산되기 때문입니다. 정확히 숫자를 삭제하는 코드를 어떻게 바꿀 수 있습니까? 사용자가 원하는가? 소스 및 대상 버퍼가 겹치는 경우문자열에서 문자 삭제

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

int main(int argc, char *argv[]) { 
    char a[30]; 
    int n,i; 
    printf("enter a string\n"); 
    gets(a); 
    printf("enter position you want to delete\n"); 
    scanf("%d",&n); 
    for(i=1;a[i];i++); 
    strcpy(&a[n],&a[n+1]); 
    printf("the result is:\n"); 
    puts(a); 
    getch(); 
    return 0; 
} 
+1

들여 쓰기를 사용해야합니다! – zoska

+0

원본과 대상 strcpy가 겹칩니다. 또한 for 루프는 아무 것도 수행하지 않으며 사용자로부터 입력 번호의 경계를 확인하지 않습니다. –

답변

4

귀하의 코드가 유효하지 않습니다, 당신은 strcpy()을 사용할 수 없습니다.

그런 경우에는 memmove()을 사용해야합니다. memmove()은 문자열 함수가 아니므로 0 종단을 사용하지 않으므로 이동 바이트 수를 전달해야합니다.

또한, gets()을 사용하지 마십시오. 매우 위험합니다 (버퍼 오버플로 방지 기능 없음). 위의 용도 0 기반 인덱싱을

char a[128]; 

if(fgets(a, sizeof a, stdin)) 
{ 
    const size_t len = strlen(a); 
    int n; 

    printf("enter index> "); 
    flush(stdout); 
    if(scanf(" %d", &n) == 1 && n < len) 
    { 
     memmove(a + n, a + n + 1, len - n); 
    } 
} 

:

당신은 뭔가를해야한다. 1 기반 인덱싱을 원한다면 가장 안쪽을 바꾸십시오 if :

if(scanf(" %d", &n) == 1 && n > 0 && n <= len) 
{ 
    --n; 
    memmove(a + n, a + n + 1, len - n)); 
} 
+0

이런 종류의 대답은 저처럼 보이지 않습니다 ... – zoska

+0

여전히 OP의 의심에 답을하지 않았습니다. + n에서 문자열을 이동하고 있으므로 누군가가 첫 번째 문자를 제거하려고 할 때 "제거합니다" 2 위. – zoska

+0

플래시 및 memmove 용 라이브러리는 무엇입니까? –