2012-02-24 2 views
0

fgets를 사용하여 문자열을 입력하고 있습니다. "Hello World". 나는 단어 사이의 공백을 삭제하려고 노력하지만, 노력하고있는 것은 hello @ world (@는 임의의 문자 임)를 계속 반환합니다. 이 공백이 아닌 경우C - 문자열 내의 공백 삭제

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 


    for(i = 0; i < 200; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[i] = phrase[i]; 
     } 
    } 

    printf("%s", temp); 
} 

그래서 나는 기본적으로 임시 배열에 구부터 문자 [I]를 복사,하지만 난 왜 내가 대신 임의의 문자를 받고 있어요에 관해서는 확실 해요 예를 들어, helloworld.

+1

당신이 임의의 문자를 받고있다. – Eimantas

답변

5

을-종료 제로로 필요, 당신은 단순히 초기화되지 않은 (포함 된 쓰레기)를 떠나, temp에 해당하는 위치를 스킵하고 있습니다. temp 어레이의 현재 위치를 추적하려면 별도의 카운터가 필요합니다.

또한 모든 200자를 맹목적으로 복사하는 대신 \0 문자로 끝나는 phrase의 문자열을 확인하고 temp 문자열도 안전하게 종료되었는지 확인해야합니다.

결과 출력을 위해 실제로는 temp[]이 충분히 큰지 확인하는 것이 추가 연습으로 남습니다. (단서에 대한 Gandaro의 대답을보십시오.)

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 

    for(i = 0, j = 0; phrase[i] != '\0'; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[j++] = phrase[i]; 
     } 
    } 

    temp[j] = '\0'; 
    printf("%s", temp); 
} 
3

적어도 3 문제 :

  • 당신은 소스 문자열은 항상 긴 200 자 될 것 확실합니까? 대신 \0을 확인해야할까요?

  • temp에 대해 별도의 색인을 사용해야합니다. 이제 문자를 건너 뛸 때 temp에 초기화되지 않은 "구멍"이 남습니다.

  • 당신은 당신이 phrase에 공백 문자를 볼 때마다 temp

0

당신이 temp[i]=phrase[i]을 건너 뛰는 비록, 당신은 임시 내의 위치를 ​​때마다 루프를 증가했다. i와는 독립적 인 temp 내의 위치를 ​​추적하기위한 변수가 필요합니다.

1

공백이있는 위치의 문자열에 값을 할당하지 않기 때문에.

실제로 동작하는 코드는 다음과 같습니다 당신이 원하는 것을 지정하지 않기 때문에

void sortString(char phrase[]) 
{ 
    int i = 0, j; 
    char *temp = malloc(strlen(phrase) + 1); 

    if (temp == NULL) 
    { 
     perror("A fatal error occured...\n"); 
     return; 
    } 

    for (j = 0; phrase[j]; j++) 
    { 
     if(!(isspace(phrase[j]))) 
     { 
      temp[i++] = phrase[j]; 
     } 
    } 

    temp[i] = 0; 

    printf("%s", temp); 
    free(temp); 
} 
+0

구문에 공백이 아닌 문자가 200 개 이상 있으면 실패합니다. – swestrup

+0

제 편집 이후가 아닙니다. : P – Gandaro

+0

물론, 지금은 메모리 누수가 있습니다. :-P – swestrup