Удалить пробел из строки - PullRequest
0 голосов
/ 31 марта 2011

Я пытаюсь создать программу, которая удаляет пробелы из строки. Кто-то может дать мне руку?

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;
}

ТНХ

Ответы [ 5 ]

3 голосов
/ 31 марта 2011

Ну, так как вы используете триммер C, это не вариант. Прежде всего, что вы думаете о линии: str [i] = str [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';

Если вы хотите записать в другую строку, просто укажите точку записи в том месте, где вы хотите ее видеть. Не забудьте проверить, что там достаточно места;)

1 голос
/ 31 марта 2011

Несколько проблем:

  1. НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА НИКОГДА не используйте 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;
}

Очевидно, это изменяет исходную строку.Если по какой-то причине вам необходимо сохранить исходные данные, вам придется объявить второй буфер для хранения измененной строки.

1 голос
/ 31 марта 2011

вы можете использовать 2 указателя. Я не знаком с 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 голосов
/ 31 марта 2011

Этот код работает быстро и отлично работает .. надеется, что это поможет в вашем случае .. Скопируйте и вставьте в файл и протестируйте его

#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);
}

Это отлично работает ..

0 голосов
/ 31 марта 2011

Что вы собираетесь делать в этом условном выражении?

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

Что на самом деле происходит?(подсказка: перечитайте раздел на i ++)

- Пит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...