2
ADRenaLINДля извлечения слов из строки можно воспользоваться C'шным "парсером"
strtok(...) из
string.h.
Это очень просто:
char *Word=strtok(Input, ",");
do printf("%s\n", Word); while(Word=strtok(NULL, ","));
К сожалению, этот глупый подход делит строку на строки также грубо как и код
creative'a (хотя его код правильно отфильтровывает слова с удвоенными буквами).
Строку
"," со списком разделитей из примера приведенного выше можно заменить на
", ", что позволит более аккуратно выделять слова, правда в этом случае отклонение от первоначальной постановки задачи будет ещё более значительным. К тому же, эта функция повреждает исходную строку (фактически в строке остается только первое слово).
Но я все-таки приведу пример решения вашей задачки с применением именно такого подхода; протестируйте его (теперь распознаются слова с удвоенными буквами):
#include <stdio.h>
#include <string.h>
/* Warning! Source data will be damaged. */
void Extract(char *Input)
{
char *Word, *Extracted, Symbol;
/* Extract first word. */
if(Extracted=Word=strtok(Input, ", "))
do
/* Scan current word. */
while(Symbol=*Word)
/* Find "duplet". */
if(Symbol==*++Word)
{
/* Print current word and
continue the extraction process. */
printf("%s\n", Extracted);
break;
}
/* Extract next word. */
while(Extracted=Word=strtok(NULL, ", "));
}
Что же касается вашего неработающего кода... Проблема вашего кода не только в том, что вы напутали с алгоритмом и индексами, но и в том, что вы перенесли нормальные для мира pascal'а идиомы на более низкоуровневый язык, коим является C.
Вот например, взглянем на конструкцию
sl = sl + s[i]. Вы хотели добиться конкатенации
sl и символа
s[i]. Это подразумевает по крайней мере автоматическое перераспределение памяти для размещения в ней увеличивающейся строки. Но ничего такого в C и близко нет! И даже понятия "строка" в нем тоже нет! Строки это всего-лишь указатели на соответствующий кусок памяти, т.е. всего-лишь число... И с этими числами можно выполнять арифметические операции. Например если
s -- строка, то
s+1 будет той-же строкой, но без первого символа (прибавив единицу мы сместились на один символ "вправо").
Так в вашем случае вы должны просто запоминать "позицию" искомого слова и затем выводить соответствующий фрагмент исходной строки. Например по указателю на начало слова и длине слова. Именно поэтому ранее упоминавшаяся функция
strtok(...) портит строку -- она просто вставляет после выделенного слова нулевой символ-ограничитель на который можно ориентироваться при извлечении слова.
Кстати, коль скоро в C используются null-terminated строки, то и про функцию
strlen(...) лучше вспоминать лишь в крайнем случае (для определения длины строки эта функция сканирует всю строку, ища нулевой ограничитель; в то время как в pascal-строках длина хранится вместе со строкой).