Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.
Ну, скажем... Вот так:
#include <stdio.h>Подойдет?
#include <ctype.h>
int main() {
char s[256] = "begin end starting finishing f\0";
int len = 0, max_len = 0; char *p, *pp, *start;
// gets(s);
// изначально и P и PP указывают на начало обрабатываемой строки S
for(p = pp = s; ;) {
// В следующем фрагменте находится длина самого длинного слова в строке (len)
// и сохраняется указатель на его начало (start)
// если очередной символ (*p - это разыменование указателя на символ,
// значит это и есть сам символ) - НЕ конец строки (строки в С заканчиваются
// нулем, соответственно *p будет истиной если конец строки не достигнут, и
// ложью если мы уже пришли на конец строки ) и является буквой или цифрой
// (это проверяется готовой библиотечной функцией isalnum), то просто увеличиваем
// длину слова
if(*p && isalnum(*p)) {
len += 1;
}
else {
// раз мы здесь - значит добрались до конца строки или просто слово закончилось
// в обоих случаях надо проверить, не является ли только что закончившееся слово
// более длинным, чем то, что было самым длинным раньше...
if(max_len < len) {
max_len = len; start = pp; // да, последнее слово длиннее - запоминаем его начало и длину
}
// в любом случае после обработки слова надо сбросить счетчик длины,
// и запомнить в PP позицию следующего (за текущим) символа, вдруг ПОТОМ выяснится,
// что именно там начинается еще более длинное слово...
len = 0; pp = p + 1;
}
// если еще не добрались до конца строки - продвигаемся дальше,
// иначе просто завершаем цикл поиска самого длинного слова...
if(*p) p++;
else break;
}
// вот теперь у нас в start - указатель на начало слова, которое надо удалить,
// а в max_len - его длинна.
// Как удалять слово? Правильно, копировать символы с позиции start + max_len
// (сразу ПОСЛЕ удаляемого слова) в позицию start - заменяя удаляемое слово тем,
// что идет следом за ним...
// Вот и делаем то, что написано выше:
// p - это КУДА будем копировать (приемник);
// pp - ОТКУДА будут копироваться символы (источник)
p = start; pp = start + max_len;
do {
*p++ = *pp; // Копируем символ и увеличиваем индекс ПРИЕМНИКА
} while(*pp++); // Пока ИСТОЧНИК не достиг конца строки, его тоже увеличивать
// Все, слово удалено
printf("%s\n", s, max_len);
return 0;
}
Если бы я еще понимал что ты тут делаешь. Что такое: 1)if(*p && isalnum(*p))
2) if(*p) p++;3)*p++ = *pp;
Вобще если бы написал пояснения, хотя хотелось бы чтобы была написана более понятно
Спасибо огромное с комментариями намного лучше.