Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.
volvo
26.12.2007 0:39
Ну, скажем... Вот так:
#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; }
Подойдет?
Янычар
26.12.2007 3:27
Если бы я еще понимал что ты тут делаешь. Что такое: 1)if(*p && isalnum(*p)) 2) if(*p) p++;3)*p++ = *pp; Вобще если бы написал пояснения, хотя хотелось бы чтобы была написана более понятно
volvo
26.12.2007 4:04
Цитата
хотелось бы чтобы была написана более понятно
Это на С-то? Более понятно чем что? Чем на Паскале? Так в С другой путь работы со строками, чтобы решать подобные задачи тебе надо иметь хоть малейшее понятие об указателях и работе с ними. Не работают в Сях так, как в Паскале - индексируя символы строки целым числом...
Я добавил комментарии, если что еще непонятно - спрашивай...
Янычар
26.12.2007 14:11
Спасибо огромное с комментариями намного лучше.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.