2011-03-31 4 views
0

문자열에서 공백을 삭제하는 프로그램을 만들려고합니다. 누군가 내게 줄 수 있습니까?문자열에서 공백 삭제

int main() 
{ 
    char str[15]; 
    int i=0; 
    gets(str); 
    while(str[i] !=0){ 
     if(str[i] == 32) 
     { 
      str[i++] = str[i]; 
      str[i] = str[i++]; 
     } 
    } 
    str[strlen(i)] = '\0'; 
    printf("%s", str); 
    return 0; 
} 

들으

+0

무엇인가 귀하가 게시 한 현재 코드의 단점은 무엇입니까? –

+0

그것의 didnt 일. str [strlen (i)] = '\ 0'; str [strlen (str)] = '\ 0'; – yEL155

+0

숙제? 문제가 없다면 그냥 태그로 표시하여 더 나은 대답을 얻을 수 있습니다. – pmg

답변

1

당신은이 포인터를 사용할 수 있습니다. C에 익숙하지 않아 str [i] == 0은 문자열의 끝을 의미합니다.

int main() 
{ 
    char str[15]; 
    int i=0; 
    int j=0; 
    gets(str); 
    while(str[i] !=0 && str[j] !=0){ 
     while(str[j] == 32) 
     { 
      j++; 
     } 
     if (str[j] ==0){ 
      break; 
     } 
     str[i] = str[j]; 
     i++; 
    } 
    str[strlen(i)] = '\0'; 
    printf("%s", str); 
    return 0; 
} 
+0

예,'gets'에 의해 생성 된 문자열은 여러분이 버퍼를 넘치지 않았을 때 0 (null)으로 끝납니다. –

3

잘 사용하고 있기 때문에 C trim은 옵션이 아닙니다. 우선, 줄에 대한 여러분의 생각은 무엇입니까? str [i] = str [i ++]; ? 이것은 기본적으로 i ++와 동일합니다. 이제 코드

:

char *mystring, *read, *write; 
// mystring gehts filled with a null terminated string here 
read = mystring; 
write = mystring; 
while(*read != '\0') { 
     if(*read == ' ') 
      read++; 
     else 
      *write++ = *read++; 
} 
*write = '\0'; 

당신이 다른 문자열로 쓰기 당신이 원하는 위치에 쓰기 지점을 좋아한다면

.) 충분한 공간이 있는지 확인하는 것을 잊지 마십시오.)

0

이 조건부에서 어떤 일이 발생하려고합니까?

if(str[i] == 32) 
     { 
      str[i++] = str[i]; 
      str[i] = str[i++]; 
     } 

실제로 어떤 일이 발생합니까? (힌트 : 내가 ++에 절을 다시 읽어)

- 피트

1

몇 가지 문제 :

  1. NEVER NEVER NEVER NEVER NEVER NEVER 사용 gets. 우선, C99에서 비추천이고 표준의 다음 개정에서 사라질 것입니다. 둘째로, 코드에서 오류 지점을 소개합니다 (일 수 없음 소개, 소개). 대신 gets(str) 대신 fgets(str, sizeof str, stdin)을 사용하십시오. 대신 숫자 값

  2. 사용 문자 상수, 전 세계가 ASCII하지 않기 때문에 :

     
    if (str[i] == ' ') // not str[i] == 32 
    

  3. 공백 양식 피드, 탭이 포함되어, 반환 등뿐만 아니라 공간; 개별 값을 확인하는 대신 isspace() 라이브러리 기능을 사용하십시오.

  4. 다음 줄이 문제가됩니다.

     
    
    str[i++] = str[i]; 
    str[i] = str[i++]; 
     
    
    우선, 정의되지 않은 동작이 호출됩니다. 시퀀스 포인트간에 객체를 두 번 이상 읽고 업데이트하려고합니다. 둘째로, 나는 논리가 확실하지 않다. 요소를 건너 뛰지 않고 요소를 바꾸려고하는 것 같습니다.

  5. strlen에 정수 값을 전달하면 작동하지 않습니다. 그것은 정수 값을 주소로 해석 할 것이고 (잠재적으로 나쁜 결과를 가져와 적어도 경고를 얻어야합니다).

두 배열 인덱스와 단일 루프에서이 작업을 수행 할 수 있습니다

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

int main(void) 
{ 
    char str[15]; 

    if (fgets(str, sizeof str, stdin) != NULL) 
    { 
    size_t r, w; 

    printf("Original: \"%s\"\n", str); 

    /** 
    * str[r] is the element that we are reading; str[w] 
    * is the element that we are writing 
    */ 
    for (r = 0, w = 0; str[r] != 0; r++) 
    { 
     if (!isspace(str[r])) // if str[r] is not a whitespace character 
     str[w++] = str[r]; // write it to str[w]; note that we only 
           // advance w for non-whitespace chars 
    } 
    str[w] = 0; // add the 0 terminator at the end 

    printf("Stripped: \"%s\"\n", str); 
    } 
    return 0; 
} 

은 분명히, 이것은 원래의 문자열을 변경합니다. 어떤 이유로 원본 입력을 유지해야하는 경우 수정 된 문자열을 보관할 두 번째 버퍼를 선언해야합니다.

0

이 코드는 .. 빨리와 .. 잘 작동이 UR의 경우 .. 복사를 위해 도움 파일에 붙여 테스트를 희망

#include <stdio.h> 
main() 
{ 
    char str[100]; 
    int len = 0; 
    gets(str); 
    len = strlen(str); 
    int i = 0; 
    while(str[i]!='\0') 
    { 
     if(str[i] == ' ') 
     { 
      memcpy(&str[i], &str[i+1], len - i); 
      len--; 
     } 
     i++; 
    } 
    str[len] = '\0'; 
    printf("O/P : %s\n",str); 
} 

이 잘 작동 ..