Найти в строке слова, состоящие из разных букв. Выдаёт ошибку. Пример ввода: ffff ghytr. вывод: ghytr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Найти в строке слова, состоящие из разных букв.
char *far (char *s)
{
int flag = 0;
int len=0;
int i=0;
char *res=calloc(strlen(s)+1, sizeof(char));
while (s[i] == ' ')
{ ++i; }
while (s[i])
{
int j=i;
while( s[j] != ' ')
{
j++;
if (s[i] != s[j])
{flag = 1;}
}
if (flag == 1)
{
strncat (res, &s[i], j-i);
strncat(res, " ", 1);
}
len+= j-i;
while (s[j] == ' ') { ++j; }
i=j;
}
res = (char*)realloc(res, len + 1);
res[len] = '\0';
return res;
}
int main()
{
char *s[203];
char *res = NULL;
scanf("%200[^\n]s" , s);
res = far(s);
printf("%s", res);
free(res);
res = NULL;
}
Ответы (2 шт):
Автор решения: Sergey
→ Ссылка
У Вас тут слишком много ошибок... Наиболее очевидные:
1)
char *s[203];
scanf("%200[^\n]s" , s);
Здесь символ '*' в описании строки совершенно лишний.
2)
while( s[j] != ' ')
{
j++;
if (s[i] != s[j])
{flag = 1;}
}
Здесь Вы сравниваете очередной символ слова только с первым символом, а не со всеми символами попарно.
В качестве рекомендации: есть такое правило в программировании: каждая функция должна выполнять только одно действие. Ваша функция far() выполняет два действия:
- Выделение слова
- Проверка повторяемости символов
Поэтому рекомендую Вам организовать в функции main() цикл перебора слов в строке, внутри которого будут вызываться две функции - выделения и проверки.
Автор решения: Ира Дынина
→ Ссылка
Исправленное и рабочее(возможно не самое эффективное):
char *far (char *s)
{
int len=0, i=0;
char *res=calloc(strlen(s)+1, sizeof(char));
while (s[i] == ' ')
{ ++i; }
int flag=0;
while (s[i])
{
int j=i;
while( s[j] != ' ' &&s[j] != '\0')
{
if (s[i] != s[j])
{flag = 1;}
j++;
}
if (flag == 1)
{
strncat (res, &s[i], j-i);
len+= j-i;
len++;
strncat(res, " ", 1);
flag=0;
}
while (s[j] == ' ') { ++j; }
i=j;
}
res = realloc(res, len + 1);
res[len] = '\0';
return res;
}
int main()
{
int w_continue=1;
while (w_continue)
{
char s[203];
char *res = NULL;
scanf("%200[^\n]s" , s);
res = far(s);
printf("%s", res);
if(*res==NULL)
{
printf("no words with different letters");
}
free(res);
res = NULL;
printf("\nIf you want to stop-press 0\n");
scanf("%d", &w_continue);
}
return 5;
}