Помощь - Поиск - Пользователи - Календарь
Полная версия: Задачка на Си
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Янычар
Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.
volvo
Ну, скажем... Вот так:

#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;
Вобще если бы написал пояснения, хотя хотелось бы чтобы была написана более понятно
volvo
Цитата
хотелось бы чтобы была написана более понятно
Это на С-то? Более понятно чем что? Чем на Паскале? Так в С другой путь работы со строками, чтобы решать подобные задачи тебе надо иметь хоть малейшее понятие об указателях и работе с ними. Не работают в Сях так, как в Паскале - индексируя символы строки целым числом...

Я добавил комментарии, если что еще непонятно - спрашивай...
Янычар
Спасибо огромное с комментариями намного лучше.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.