Игра со строковыми функциями - PullRequest
0 голосов
/ 24 ноября 2011

Это очень маленький вопрос, и, возможно, что-то действительно глупое! Но почему в выводе возвращается функция для этой функции, которая должна удалять двойные буквы?

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

char  *makehello( char *s ) {
   char new[16] ;
   int i ;
   int c = strlen(s);
   for ( i = 0; i < (c + 1); i++)
     if (toupper(s[i]) != toupper(s[i+1]))
       new[i] = toupper(s[i]);
return strdup( new ) ;  
}

int main(void) {
 char *new;
 char data[100];
 scanf("%s", data);
 new = makehello(data);
 printf("%s", new);
return 0;
}

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Вам нужен отдельный счетчик для вашего «нового» массива. Вы сохраняете их по индексу 'i' (где вы нашли символ), но на самом деле вы хотите сохранить их с позиции 0 и вместо этого увеличить это число.

РЕДАКТИРОВАТЬ: Конечно, это не полностью защищенный метод.

т.е. что-то вроде этого:

   for ( i = 0; i < c; i++)
   {
        if (toupper(s[i]) != toupper(s[i+1]))
        {
            new[count++]= toupper(s[i]);
        }
   }
   new[count] = '\0';
0 голосов
/ 24 ноября 2011

Вот довольно компактная версия алгоритма C99 (заголовки опущены, пример ):

const char * makehello (const char * s)
{
  char new[16] = { *s, 0 };
  const char * p = s;
  char c = *s, * q = new;

  while (*p) { if (*++p != c) { c = *++q = *p; } }

  return strdup(new) ;
}

int main(void)
 {
  char data[100];
  scanf("%s", data);
  printf("%s", makehello(data));
  return 0;
}

(Этот дискриминирует регистр.)

0 голосов
/ 24 ноября 2011

Линия

for ( i = 0; i < (c + 1); i++) 

должно быть

for ( i = 0; i < (c - 1); i++)

И тогда вам нужно до strdup new [i] = 0;

Брекеты тоже не помешают.

EDIT

Забыл, нужно изменить следующее

int i, j=0;

и в цикле for

new[j++] = toupper(s[i]);

и после цикла for

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