|
Строки в языке С.
Строка – символьный массив, который заканчивается ‘\0’. В отличие от строки, буфер – это символьный массив, размер которого нужно задавать явно.
Прототипы функций работы с буферами находятся в файле “mem.h”, со строками – в файле “string.h”
Дадим краткий обзор этих функций. Здесь str1, str2, buf1, buf2 – символьные массивы, n – целая переменная, sim – переменная типа char.
Функции работы со строками. | ||||
№ | Функция | Синтаксис | Действия | Возвращаемое значение |
1. | strcat | char *strcat (str1,str2) | Приклеивает строку str2 к str 1. | Указатель на str1 |
2. | strncat | char *strcnat (str1,str2,n) | Приклеивает n символов строки str2 к str 1. | Указатель на str1 |
3. | strchr | char *strchr (str1, sim) | Ищет символ sim в строке str1 | Указатель на sim, если нашла. NULL, если нет. |
4. | strcmp | int strcmp (str1, str2) | Лексикографически сравнивает строки str1 и str2 | <0, если str1<str2 =0, если str1=str2 >0, если str1>str2. |
5. | strncmp | int strncmp (str1, str2, n) | Лексикографически сравнивает первые n символов строк str1 и str2 |
См. strcmp. |
6. | stricmp | int stricmp (str1, str2) | Лексикографически сравнивает строки str1 и str2. Маленькие и большие буквы считаются одинаковыми. |
См. strcmp |
7. | strnicmp | int strnicmp (str1, str2, n) | Cравнивает первые n символов строк str1 и str2. Маленькие и большие буквы считаются одинаковыми. |
См. strcmp |
8. | strcpy | char *strcpy (str1, str 2) | Копирует строку str2 в str1. | Указатель на str1 |
9. | strncpy | char *strcnpy (str1,str 2,n) | Копирует n символов строки str2 в str1. | Указатель на str1 |
10. | strcspn | int strcspn (str1, str2) | Ищет в строке str1 первое вхождение символа из строки str2. | Количество символов из str1 до первого вхождения символа из str2 |
11. | strdup | char *strdup (str1) | Выделяет область памяти под строку. Копирует str1 в эту область. | Указатель на начало этой области. |
12. | strset | char *strset (str1, sim) | Заполняем строку str1 символом sim. | Указатель на str1 |
13. | strnset | char *strnset (str1, sim, n) | Заполняем первые n элементов строки str1 символом sim. | Указатель на str1 |
14. | strlwr | char *strlwr (str1) | Преобразует str1 в прописные буквы | Указатель на str1 |
15. | strupr | char *strupr (str1) | Преобразует str1 в заглавные буквы | Указатель на str1 |
16. | strrev | char *strrev (str1) | Переворачивает строку str1 задом наперед. | Указатель на str1 |
17. | strstr | char *strstr (str1, str2) | Ищет подстроку str2 в строке str1. | Указатель на начало подстроки |
18. | strlen | int strlen (str1) | Находит длину str1. | Длина str1. |
Функции работы с буферами. | ||||
№ | Функция | Синтаксис | Действия | Возвращаемое значение |
19. | memchr | char *memchr (buf1, sim, n) | Ищет символ sim среди первых n символов buf1. | Указатель на sim, если нашла. NULL, если нет. |
20. | memcmp | int memcmp (buf1, buf2, n) | Лексикографически сравнивает первые n символов buf1 и buf2 | <0, если buf1<buf2 =0, если buf1=buf2 >0, если buf1>buf2. |
21. | memicmp | int memicmp (buf1, buf2, n) | Cравнивает первые n символов строк buf1 и buf2. Маленькие и большие буквы считаются одинаковыми. |
См. memcmp |
22. | memcpy | char *memcpy(buf1,buf2,n, sim) | Копирует из buf2 в buf1 до тех пор, пока не встретится символ sim или не скопируем n байтов. | Указатель на buf1 |
23. | memccpy | char *memcpy(buf1,buf2,n) | Копирует n символов из buf2 в buf1. | Указатель на buf1 |
24. | memset | char *memset (buf1, sim, n) | Заполняем первые n байт буфера buf1 символом sim. | Указатель на buf1 |
Помимо данных функций, во многих задачах можно использовать макросы, которые осуществляют проверку символа:
Определение класса символов. | ||
№ | Функция | Проверка на… |
25. | isalpha | Букву |
26. | isalnum | букву или цифру |
27. | isascii | символ ASCII |
28. | iscntrl | управляющий символ |
29. | isdigit | десятичную цифру |
30. | isxdigit | 16-ричную цифру. |
31. | isgraph | печатаемый символ (не пробел). |
32. | isprint | печатаемый символ (в том числе и пробел). |
33. | islower | прописную букву. |
34. | isupper | заглавную букву. |
35. | isspace | пробельный символ. |
36. | ispunct | знак пунктуации. |
Приведем пример использования данных функций.
Дано предложение. Напечатать все его слова, состоящие из трех слогов.
char str [100];
char *str1 =”аоуэыАОУЭЫ”;
int chisloSlogov(int nach, int con);
void pechatSlovo(int nach, int con);
main(){
int nachalo =0, dlina;
clrscr();
gets(str);
strcat(str,” “);
while(str [nachalo]!=’\0’){
dlina = strcspn(str+nachalo, “ ”);
if(chisloSlogov(nachalo, nachalo+dlina) == 3)
pechatSlovo(nachalo, nachalo+dlina);
nachalo=nachalo+dlina+1;
}
getch();
return(0);
}
int chisloSlogov(int nach, int con){
int sch=0;
for(int i=nach; i<=con;i++)
if(strchr(str1,str[i])!=NULL)
sch++;
return(sch);
}
void pechatSlovo(int nach, int con){
for(int i=nach; i<=con;i++)
printf(“%c”,str[i]);
}
Ввод – вывод.
Различают ввод – вывод верхнего уровня (с испоьзованием понятия “поток”) и ввод – вывод нижнего уровня (с использованием понятия “дескриптор”).
Ввод – вывод верхнего уровня обеспечивает буферизацию (когда происходит чтение или запись в файл, обмен информацией осуществляется не между программой и файлом, а между программой и буфером, расположенным в оперативной памяти).
Запись.
Пишем в буфер, пока он не заполнится. Информация переписывается из буфера в файл или при заполнении всего буфера, или при закрытии файла.
Чтение.
Читаем из буфера. В буфер информация пишется при открытии файла и при заполнении буфера.
На верхнем уровне возможны форматный ввод – вывод (функции fprintf и fscanf).
Файл, открытый на верхнем уровне – последовательность считываемых или записываемых байтов (поток, stream). Когда поток открывается для ввода – вывода, с ним связывается указатель на структуру типа FILE, которая содержит разнообразную информацию о файле.
Далее функции работы с файлом используют не имя файла, а этот указатель.
В любой момент открыты 5 стандартных потоков:
stdin | Стандартный ввод |
stdout | Стандартный вывод |
stderr | Стандартный вывод ошибок |
stdoux | Стандартный порт |
stdprn | Стандартное устройство печати |
Открытие файла для потокового ввода-вывода осуществляется с помощью функции fopen.
Синтаксис данной функции следующий:
FILE * fopen(char *name, char *type);
Функция открывает файл с именем name и возвращает указатель на структуру типа FILE, которая связана с нашим файлом. Все остальные функции ввода-вывода будут обращаться к файлу при помощи этого указателя.
Аргумент type показывает, для чего мы открываем файл. Он может принимать следующие значения:
“r” | Открыть для чтения (файл должен существовать). |
“w” | Открыть для записи (Открывается пустой файл. Если файл с таким именем существовал, его содержимое теряется) |
“a” | Открыть для добавления (Если файл не существует, он создается) |
“r+” | Чтение + Запись (Файл должен существовать) |
“w+” | Пустой файл для чтения и записи. |
“a+” | Чтение и добавление. |
Можно еще добавить t – текстовый файл или b – двоичный (объяснить разницу).
Лучше открывать файл с проверкой.
FILE *f;
if ((f=fopen(“mfile.c”,”rb+”))==NULL){
printf(“Не могу открыть файл”);
getch();
exit(1);
}
fclose (f) – закроет этот файл.
Место в файле, начиная с которого мы читаем или пишем, называется file pointer. Можно в разумных пределах перемещать file pointer по файлу.
Функция ftel(f) возвращает значение file pointer () в байтах.
Функция rewind(f) перемещает file pointer в начало файла.
Функция fseek(f,смещение, нач. значение) перемещает file pointer в нужное место файла.
Здесь смещение – это количество байтов, на которое мы хотим переместить file pointer (Может быть и отрицательным).
Нач. значение показывает, откуда мы отсчитываем смещение:
От начала файла | |
От текущего file pointer | |
От конца файла |
Функция feof(f) проверяет, достигли ли мы конца файла.
Функции ввода – вывода высокого уровня:
Чтение | Запись | ||
символа | |||
fgetc | Из потока | fputc | В поток |
fgetchar | Из stdin | fputchar | В stdout |
getc | Из потока(макрос) | putc | В поток (макрос) |
getchar | Из stdin (макрос) | putchar | В stdout (макрос) |
getch | С консоли без эха | putch | На консоль |
getche | С консоли с эхом |
|
|
| |||
строки | |||
fgets | Из потока | fputs | В поток |
gets | Из stdin | puts | В stdout |
cgets | С консоли | cputs | На консоль |
| |||
Неформатированное чтение / запись | |||
fread |
| fwrite |
|
| |||
Форматированное чтение / запись | |||
cscanf | С консоли | cprintf | На консоль |
fscanf | Из потока | fprintf | В поток |
scanf | Из stdin | printf | В stdout |
sscanf | Из строки | sprintf | В строку |
Привести примеры использования.
Дата добавления: 2015-09-29; просмотров: 23 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
| | 1.1. Поняття та значення строків (термінів) у цивільному праві |