Написать программу на Си, которая находит в строке слова, имеющие одинаковые символы, и записывает их в другую строку без пробелов
На вход поступает строка(с клавиатуры) слов(не обязательно существующих), разделенных одним пробелом. Требуется найти среди них слова, в которых есть одинаковые буквы, и вывести их на экран в виде строки без пробелов.
Например:
input = "ggghghhghg qwerty ssoga zxcvb sssuper"
output = "ggghghhghgssogasssuper"
#include <stdio.h>
#include <string.h>
int main() {
int m = 0, n = 0, d = 0;
char words[1001];
char curword[101];
char finwords[1001];
printf(">Enter the string of words (under 1000 symbols):\n");
fgets(words, sizeof(words)-1, stdin);
for (int i = 0; i<strlen(words)-1; i++) {
if (words[i] != ' ') {
curword[m] = words[i];
m++;
} else if (words[i] == ' ') {
for (int j = 0; j<strlen(curword)-2; j++) {
for (int k = j+1; k<strlen(curword)-1; k++) {
if (curword[j] == curword[k]) {
n = 1;
}
}
}
if (n == 1) {
for (int j = 0; j<strlen(curword)-1; j++) {
finwords[d] = curword[j];
d++;
}
n = 0;
}
memset(curword, 0, sizeof(curword));
m = 0;
}
}
printf(">Result is\n");
puts(finwords);
return 0;
}
После запуска выдает невнятные символы, либо теряет последний символ в каждом выведенном слове.
Ответы (1 шт):
Автор решения: Sergey
→ Ссылка
Разбираться в программе, которая:
- Не разбита на функции, хотя это явно нужно сделать
- Не содержит ни одного комментария
- Зачем-то использует memset() хотя в этом явно нет никакой необходимости
- ...
Нет ни малейшего желания. Рекомендую Вам переписать её с нуля, с двумя улучшениями:
- Для разбивки строки на отдельные слова используйте стандартную фу-цию strtoc() (http://all-ht.ru/inf/prog/c/func/strtok.html)
- Для поиска повторяющихся в слове букв напишите отдельную функцию.
Функция должна быть организована приблизительно так:
/*
word - обрабатываемое слово
return - 0- нет повторений, не 0 - есть повторенния
*/
int check(char *word) {
int counts[52]; // a..z, A..Z
int j;
for (j=0; j<52; j++) counts[j] = 0;
for (j=0; j<strlen(word)-1; j++) {
counts[word[j] - 'a']++;
}
for (j=0; j<52; j++) if (counts[j] > 1) return 1;
return 0;
}