2013-07-21 8 views
2

У меня есть эта строкаУдалить лишние пробелы из строки в C

"go for goa" 

и выход должен быть

"go for goa" 

Я хочу, чтобы удалить лишние пробелы. Это означает, что два или более последовательных пробела должны быть заменены одним пробелом. Я хочу сделать это, используя алгоритм на месте.

Ниже приведен код, я пытался, но он не работает:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
/* Function to remove spaces in an string array */ 
char *removeSpaces(char *str) { 
    int ip_ind = 1; 
    /* In place removal of duplicate spaces*/ 
    while(*(str + ip_ind)) { 
    if ((*(str + ip_ind) == *(str + ip_ind - 1)) && (*(str + ip_ind)==' ')) { 
     *(str_ip_ind-1)= *(str + ip_ind); 
    } 
    ip_ind++; 
    } 
    /* After above step add end of string*/ 
    *(str + ip_ind) = '\0'; 
    return str; 
} 
/* Driver program to test removeSpaces */ 
int main() { 
    char str[] = "go for go"; 
    printf("%s", removeSpaces(str)); 
    getchar(); 
    return 0; 
} 

ответ

1

Вы aren''t проверка пространства .. Вы проверяете на вкладке. Заменить \ т с (я имею в виду пространство ..)

0

Проблема:

  1. Вы находитесь отслеживания вкладку '\ т', но вы должны удалить пространства.
  2. Кроме того, вы отслеживаете и находите '\ t', , но у вас нет шагов к его удалению (я добавил один).
  3. Каждый раз, вы не должны увеличивать ip_ind, вы должны вкл, только тогда, когда удаление не будет сделано, потому что, когда удаление делается, что сценарий будет равен увеличиваться.
  4. Ваш сценарий не удался для "", чтобы избежать его, добавьте параметр проверки, как показано ниже (метод 1), или начните с ip_ind с 0, как в (Метод 2). (Благодаря @Lee Daniel Crocker)

Решение.

Вы могли бы попробовать, как это,

Метод 1: ip_ind начинается с одного.

/* Function to remove spaces in an string array */ 
char *removeSpaces(char *str) 
{ 
    int ip_ind = 1; 
    char *ptr; 

    if(*str) 
    return str; 

    /* In place removal of duplicate spaces*/ 
    while(*(str + ip_ind)) 
    { 
    if ((*(str + ip_ind) == *(str + ip_ind - 1)) && (*(str + ip_ind)==' ')) 
    { 
     ptr = str + ip_ind; 
     //Functionality for removal of spaces. 
     do{ 
      *(ptr-1) = *ptr; 
     }while(*ptr++ != '\0'); 


    } 
    else //Inc only if deletion is not done. 
    ip_ind++; 
    } 

/* After above step add end of string*/ 
    *(str + ip_ind) = '\0'; 

return str; 
} 

Способ 2: ip_ind начинается с нуля.

char *removeSpaces(char *str) 
{ 
    int ip_ind = 0; 
    char *ptr; 
    /* In place removal of duplicate spaces*/ 
    while(*(str + ip_ind)) 
    { 
    if ((*(str + ip_ind) == *(str + ip_ind + 1)) && (*(str + ip_ind)==' ')) 
    { 
     ptr = str + ip_ind+1; 

     do{ 
      *(ptr-1) = *ptr; 
     }while(*ptr++ != '\0'); 


    } 
    else 
    ip_ind++; 
    } 

/* After above step add end of string*/ 
    *(str + ip_ind) = '\0'; 

return str; 
} 
+0

Разве это невозможно решить, не используя дополнительный указатель ptr? – krrishna

+0

@krrishna Нет, это не так, потому что, указывая на текущую позицию, вам нужно 'ip_ind'., Для прохождения до конца вам нужно по крайней мере одну переменную. В этом случае это 'ptr' –

3

Я даже не могу сказать, что ваша функция пытается сделать. Во-первых, первый раз через, что -1 будет иметь доступ до начала строки. Попробуйте что-нибудь вроде:

char *removeSpaces(char *str) { 
    char *inp = str, *outp = str; 
    int prevSpace = 0; 

    while (*inp) { 
     if (isspace(*inp)) { 
      if (!prevSpace) { 
       *outp++ = ' '; 
       prevSpace = 1; 
      } 
     } else { 
      *outp++ = *inp; 
      prevSpace = 0; 
     } 
     ++inp; 
    } 
    *outp = '\0'; 
    return str; 
} 
+0

Нет, это не так, потому что он инициализировал ip_ind как 1. –

+1

Вы правы - вместо этого он будет терпеть неудачу для строк длиной 0. –

+0

Спасибо, обновил мой ответ на матч., Оба сценария. –

0

Ваше if состояние не работает. Я покажу вам свой код. Он похож на ваш, просто используя два указателя: back и front.

Если front не является пространством, или front пространство, но back не пробел, вам нужно скопировать front в back+1.

char *removeSpaces(char *str) 
{ 
    if (*str == '\0') return str; 

    char *back = str; 
    char *front = str + 1; 
    /* In place removal of duplicate spaces*/ 
    while(*front != '\0') 
    { 
     if (*front != ' ' || *back != ' ') // highlight 
      *(++back) = *front; 
     front++; 
    } 

    /* After above step add end of string*/ 
    *(back + 1) = '\0'; 

    return str; 
} 

Надеюсь, это может вам помочь.

0

Там вы идете:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
/* Function to remove spaces in an string array */ 
char *removeSpaces(char *str) { 
    int ip_ind = 0; 
    while (*(str+ip_ind) != 0) { 
    if (*(str + ip_ind++) == 32) { 
     if (*(str + ip_ind) == 32) { 
     int x=ip_ind; 
     while (*(str + x +1) != 0) { 
      *(str + x)= *(str + 1 + x++); 
     } 
     *(str + x)= 0; 
     --ip_ind; 
     } 
    } 
    } 
    return str; 
} 
/* Driver program to test removeSpaces */ 
int main() { 
    char str[] = "go for go"; 
    printf("%s\n", str); 
    printf("%s\n", removeSpaces(str)); 
    char str2[] = "go  for go for go"; 
    printf("%s\n", str2); 
    printf("%s\n", removeSpaces(str2)); 
    return 0; 
} 

Выход:

dda$ ./a.out 
go for go 
go for go 
go  for go for go 
go for go for go 
dda$ 
3

Большинство решений кажутся излишне сложным:

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

void strip_extra_spaces(char* str) { 
    int i,x; 
    for(i=x=0; str[i]; ++i) 
    if(!isspace(str[i]) || (i>0 && !isspace(str[i-1]))) 
     str[x++] = str[i]; 
    str[x] = '\0'; 
} 

int main(int argc, char* argv[]) { 
    char str[] = " If you gaze into the abyss, the abyss gazes also into you. "; 
    strip_extra_spaces(str); 
    printf("%s\n",str); 
    return 0; 
} 
+0

Неверно, индекс начинается с 1 в цикле –

+0

@GiorgiMoniava, я исправил его – Victor

0

Простой один для Вас

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
char a[100]; 
int i,t,k; 
scanf("%[^\n]s",a); 
t=strlen(a); 
for(i=0;i<t;) 
{ 
    if((a[i]==' ')&&(a[i+1]==' ')) 
    { 
     for(k=i+1;k<t;k++) 
     { 
      a[k]=a[k+1]; 
     } 
     t=t-1; 
    } 
    else 
     i++; 
} 
printf("%s",a); 
return 0; 
} 
Смежные вопросы