Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
150
Добавлен:
10.05.2014
Размер:
3.61 Mб
Скачать
          1. 3. Функция разбиения строки.

Данная функция может иметь следующий прототип:

int split(char *string, char *a[], char fs);

Для разбиения заданной строки stringна несколько частей необходимо указать правило разбиения и место размещения результата.

В качестве правила разбиения в рассматриваемой функции задается некоторый символ - разделитель полей (fs); сам этот символ в результирующие строки не записывается.

Функция создает и возвращает в качестве результата массив указателей на выделенные фрагменты строки (a). Поскольку количество разбиений неизвестно, функция сначала определяет его (подсчитывает, сколько раз в строке встречается символ-разделитель), затем выделяет необходимую память и формирует результат.

В результате разбиения строки исходная строка будет замещена выделенными строками. Это достигается путем замены символа-разделителя в строке нуль-байтом.

В качестве результата функция возвращает количество разбиений исходной строки.

Алгоритм функции представлен на рис. II-15.

Рис. II‑15.

Текст функции приводится ниже и в файле Programs/stringv.cpp.

int split(char *string, char *a[], char fs)

{

int i, cnt;

char *ptr;

/* прежде всего, надо определить количество разбиений строки*/

for(ptr = string, cnt = 0; *ptr; ptr++)

if(*ptr == fs){

cnt++;

*ptr = '\0';

}

/* возможно, есть еще один – последний фрагмент строки:

* после символаfsв строке до нуль-байта есть другие символы

*/

if(*(ptr-1))

cnt++;

/* теперь выделим необходимую память под указатели на фрагменты строк */

a = new (char *)[n];

/* наконец, формируем указатели на фрагменты строк */

for(i = 0, ptr = string; i < cnt; i++){

a[i] = ptr;

/* пропускаем символы строки до очередного нуль байта */

while(*ptr++)

;

}

return cnt;

}

          1. 4. Функция нахождения подстроки в строке.

Прототип функции может иметь следующий вид:

char * substr(char *string1, char *string2);

Функция возвращает указатель на первое вхождение подстроки string2в строкуstring1, илиNULL, если подстрокаstring2не входит в строкуstring1. Схема алгоритма функции приведена на рис.II-16.

Нужно обратить внимание на следующее: так как внутренний цикл может закончиться по любому из двух условий (блоки D2 – найден конец строки2 или D3 – обнаружены несовпадающие символы строк), на выходе требуется дополнительная проверка (блок E2). Если цикл закончился по условию обнаружения конца строки2, это означает, что все символы строки2 совпадали с соответствующими символами строки1, а следовательно, строка2 является подстрокой строки1, и функция завершается. Если же внутренний цикл закончился по другому условию, значит, нужно продолжать проверку.

Можно было сократить количество итераций внешнего цикла, если проверять не просто нуль-байт в конце первой строки, а учитывать длину второй строки; тогда, если вторая строка окажется длиннее первой, цикл не будет выполнен ни разу (такой вариант функции, конечно, предпочтительнее).

Рис. II‑16.

Текст функции приводится ниже и в файле Programs/stringv.cpp.

char *substr(char *string1, char *string2)

{

int len = strlen(string2), i;

char *ptr1;

for(ptr1 = string1; ptr1 < string1 - len; ptr1++){

for(i = 0; string2[i] && ptr1[i] == string2[i]; i++)

;

if(!string2[i])

return ptr1;

}

return NULL;

}

Соседние файлы в папке docs