Функция и строки - PullRequest
       4

Функция и строки

0 голосов
/ 08 октября 2018

Я новичок в C и начал изучать строки.Я хочу создать функцию с именем

void SpaceRemover(char *input )

. Она должна удалить пробел из заданного массива строк, который имеет много места

Код, который я создал до сих пор, удаляет все пробелыи не обеспечивает вывод, который я ищу.Кто-нибудь может мне с этим помочь?

char* SpaceRemover(char *input){
    char *output=input;
    for (int i = 0, j = 0; i<strlen(input); i++,j++)
    {
        if (input[i]!=' ')   
            output[j]=input[i]; 
        else
            j--;   
     }
     return output;
}

Я сделал это, но я знаю, что это неправильно, и не делаю то, что хочу, но, честно говоря, это все, что я мог, это -_-

Ответы [ 5 ]

0 голосов
/ 20 мая 2019
#include <stdio.h>

char *rem(char *str)
{
   char *cur=str;
   char *nex=str;

   while(*nex)
   {
      if(*nex == ' ') nex++;
      else *cur++ = *nex++;
   }
   *cur=0;
   return str;
}

int main(void) {
    char z[]=" etc def etc    def ";
    printf("%s\n", rem(z));
    return 0;
}
0 голосов
/ 20 мая 2019
void spaceRemover(char* str)
{
    char temp[50] = {0};
    int j = 0; 
    strncpy(temp, str, strlen(str) + 1);
    for(int i = 0; i < strlen(str); i++)
    {
        if(temp[i] != ' ')
        {
            str[j] = temp[i];
            j++;
        }   
    }
    str[j] = 0;
}

если у вас есть какие-либо вопросы, не стесняйтесь спрашивать, удачи

0 голосов
/ 08 октября 2018

Проблема в том, что вы удаляете все пробелы.

char *SpaceRemover(char *name){
  char *output = name;
  int j = 0;

  for (int i = 0; i < strlen(name); i++) {
    if (name[i] != ' ' || (name[i] == ' ' && name[i + 1] != ' ') {  
      output[j] = name[i];
      j += 1; 
    }
  }
  output[j] = '\0'
  return output;
  }

Это условие должно пропустить один пробел.
Вы можете заметить, что я заменил тип возврата void на char *, чтобыиспользуйте функцию, которую вам нужно будет использовать:

name = SpaceRemover(name);
0 голосов
/ 08 октября 2018

Вы можете просто сделать, как показано ниже

void SpaceRemover(char *name)
{
  int i=0,j=0;

  for (i = 0;i<strlen(name);i++)
   {
           if (name[i] != ' ' || (name[i] == ' ' && name[i+1] != ' ' && j!= 0))
           {
                   name[j++] = name[i];
           }
  }
  name[j]='\0'; //Terminate the string to avoid junk chars 
}

Где

if (name[i] != ' ' || (name[i] == ' ' && name[i+1] != ' ' && j != 0))

позволит вам копировать, только если текущий символ не пробел или текущий символ пробел и следующий символ не пробел(чтобы включить один пробел в начале).

Также не забудьте завершить string.

name[j]='\0';
0 голосов
/ 08 октября 2018

Я бы использовал флаг для активации, когда пробел встречается.

Это может потребоваться настроить, если вы хотите удалить также пробелы в начале и в конце.

Пробел будетдобавлен к выводу, и флаг будет использоваться, чтобы избежать добавления следующих.Флаг будет деактивирован, когда встречается что-то еще, кроме пробела.

Как указано Алекс в комментариях, уменьшение j в цикле при увеличении в выражении for не рекомендуется.

Я быскопируйте каждый символ в цикле for вместо фильтрации предварительно скопированного вывода.

char space_found = 0;
char *output = malloc(sizeof(char) * (strlen(name) + 1));
int j = 0;
for (int i = 0; i < strlen(name); ++i)
{
    if (name[i] == ' ' and space_found == 0)
    {
        space_found = 1;
        output[j++] = name[i];
    }
    if (name[i] != ' ')
    {
        space_found = 0;
        output[j++] = name[i];
    }
}
output[j] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...