Лекция: Поиск символов

Листинг 6.8 показывает, как использовать функцию strchr() для поиска отдельных символов в строке,

 

Листинг 6.8. ЕХТ1.С (проверка расширения файла, демонстрация №1)

1: #include <stdio.h>

2: #include <string.h>

3:

4: main()

5: {

6: char fileName[128];

7:

8: printf(«Enter file name: „);

9: gets(fileName);

10: printf(“As entered: %s\n», fileName);

11: if (strchr(fileName, '.’))

12: printf(«File name is probably complete\n»);

13: else

14: strcat(fileName, ".TXT");

15: printf(“Final file name: %s\n", fileName);

16: return 0;

17: }

_______________________________________________________

Скомпилируйте и запустите программу ЕХТ1, затем введите имя файла с расширением. Например, если вы введете test.txt, программа отобразит:

Enter file name: test.txt

As entered: test.txt

File name is probably complete

Final file name: test.txt

Но если вы введете test без расширения, программа присоединит к имени расширение .TXT, отобразив:

Enter file name: test

As entered: test

Final file name: test.TXT

Программа ЕХТ1 находит расширение в имени файла, выполняя поиск точки среди символов введенной строки. (В имени файла может быть только одна точка, которая должна предшествовать расширению, если оно имеется.) Ключевым в этой программе является оператор if...else (строки 11-14);

if (strchr(fileName, '.'))

printf(«File name is probably complete\n»);

else

strcat(fileName, ".TXT");

Выражение strchr(fileName, '.') возвращает указатель на символ точки в строке, адресуемой указателем fileName. Если такой символ не найден, функция strchr() возвращает нуль. Поскольку ненулевые значения означают «истину», вы можете использовать функцию strchr() в качестве возвращающей значение «исти­на»/«ложь». Вы также можете применить функцию strchr() для присваивания указателя на подстроку, начинающуюся с заданного символа. Например, если р — указатель, объявленный как char *, и указатель fileName из программы ЕХТ1 адресует строку TEST.TXT, то результат действия оператора р = strchr(fileName, '.'); показан на рис. 6.4.

Рис. 6.4 демонстрирует еще один важный момент, связанный с адресацией указателем не полной строки, а ее части — подстроки, Такими указателями следует поль­зоваться с большой осторожностью. На рисунке показана только одна строка, «TEST.TXT», оканчивающаяся нуле­вым байтом, но два указателя — fileName и р. Указатель fileName адресует полную строку. А указатель радресует подстроку внутри того же набора символов. Строковые функции не заботятся о байтах, которые предшествуют их первому символу. Поэтому оператор

puts(p);

отображает подстроку ".TXT" так, будто она полная стро­ковая переменная, а не часть другой строки.

В программировании на С нет ничего необычного в использовании многих указателей, адресующих подстроки одной и той же полной строки. Но строка, показанная на рис. 6.4, расположена в куче, поэтому оператор

free(fileName);

корректно освобождает занимаемую строкой память. Однако программа никогда не должна выполнять опера­тор вида

free(p); /* ??? */

 

Рис. 6.4. Функция strchr() находит символ в строке

 

пытаясь тем самым освободить подстроку, адресуемую указателем р, что, несомненно, приведет к разрушению кучи, вызвав ошибку, относящуюся к разряду трудно обнаруживаемых.

Функция strchr() отыскивает первое появление символа в строке. Объявления и операторы

char *p;

char s[] = «Abracadabra»;

р = strchr(s,'a');

присваивают указателю р адрес первой строчной буквы 'а' в строке «Abracadabra».

Функция strchr() рассматривает завершающий нуль строки как значащий символ. Приняв во внимание этот факт, можно узнать адрес конца строки. Учитывая предыдущие объявления, оператор

р = strchr(s,0);

установит р равным адресу нулевого символа в строке s. Используйте этот простой метод, чтобы найти конец строки.

Чтобы найти последнее появление символа в строке, вызовите функцию strrchr(). Учитывая предыдущие объявления, оператор

р = strrchr(s,' b');

установит указатель р равным адресу подстроки «bra» в конце строки «Abracadabra».

еще рефераты
Еще работы по информатике