Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Листинг 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".
Дата публикования: 2015-01-23; Прочитано: 228 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!