КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Обработка строк
Ввод-вывод строк Указатели и строки Большинство операций языка Си, имеющих дело со строками, работают с указателями. Рассмотрим, например, приведенную ниже бесполезную, но поучительную программу: /* Указатели и строки */ #define PX(X) printf("X = %s; значение = %u; &X = %u\n",X,X,&X) main() { static char *mesg = "Сообщение"; static char *copy; copy = mesg; printf("%s\n",copy); PX(mesg); PX(copy); } Мы можем подумать, что эта программа копирует строку "Сообщение", и при беглом взгляде на вывод может показаться правильным это предположение: Сообщение
mesg = Сообщение; значение = 14; &mesg = 32 copy = Сообщение; значение = 14; © = 34 Но изучим вывод PX(). Сначала X, который последовательно является mesg и copy, печатается как строка (%s). Здесь нет сюрприза. Все строки содержат "Сообщение". Третьим элементом в каждой строке является &X, т. е. адрес X. Указатели mesg и copy записаны в ячейках 32 и 34, соответственно. Теперь о втором элементе, который мы называем значением. Это сам X. Значением указателя является адрес, который он содержит. Мы видим, что mesg ссылается на ячейку 14, и поэтому выполняется copy. Смысл заключается в том, что сама строка никогда не копируется. Оператор copy = mesg; создает второй указатель, ссылающийся на ту же самую строку. Зачем все эти предосторожности? Почему бы не скопировать всю строку? Хорошо, а что эффективнее - копировать один адрес или, скажем, 70 отдельных элементов? Часто бывает, что адрес - это все, что необходимо для выполнения работы. fgets - прочитать строку из входного потока, включая символ новой строки. Определение: char *fgets (s, n, stream) char *s; int n; FILE *stream; gets - прочитать строку из стандартного файла ввода stdin. Определение: char *gets (s) char *s; fputs - записать строку в поток stream. Определение: int fputs (s, stream) char *s; FILE *stream; puts - записать строку в стандартный файл вывода stdout. В конце строк записывается символ новой строки. Определение: int puts (s) char *s; Для выполнения описанных в этом подразделе функций необходимо включить в программу файл string.h командой #include <string.h> strcat - сцепить две строки. Определение: char *strcat(s1,s2) char *s1, *s2; Пример 1: /* сцепить две строки */ /* в головном файле conio.h содержится функция очистки экрана clrscr() */ #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { clrscr(); char destination[25]; char *blank = " ", *c = "C++", *turbo = "Turbo"; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf("%s\n", destination); getch(); return 0; } strncat - сцепить две строки, причем из второй строки копировать не более n символов. Определение: char *strncat(s1,s2,n) char *s1, *s2; int n; Пример 2: /* cцепить две строки, причем из второй строки копировать не более n символов */ #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { clrscr(); char destination[25]; char *source = "structured "; strcpy(destination, "programming"); strncat(destination, source, 11); printf("%s\n", destination); getch(); return 0; } strcmp - сравнить две строки в лексикографическом порядке. Определение: int strcmp(s1,s2) char *s1, *s2; Пример 3: #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc"; int ptr; clrscr(); ptr = strcmp(buf2, buf1); if (ptr > 0) printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n"); ptr = strcmp(buf2, buf3); if (ptr > 0) printf("buffer 2 is greater than buffer 3\n"); else printf("buffer 2 is less than buffer 3\n"); getch(); return 0; } strncmp - сравнить первые n символов двух строк. Определение: int strncmp(s1,s2, n) char *s1, *s2; int n; Пример 4: #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { char *buf1 = "aaabbb", *buf2 = "bbbccc", *buf3 = "ccc"; int ptr; clrscr(); ptr = strncmp(buf2,buf1,3); if (ptr > 0) printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n");
ptr = strncmp(buf2,buf3,3); if (ptr > 0) printf("buffer 2 is greater than buffer 3\n"); else printf("buffer 2 is less than buffer 3\n"); getch(); return(0); } strcpy - копировать строку s2 в строку s1. Определение: char *strcpy(s1,s2) char *s1, *s2; Пример 5: #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { clrscr(); char string[10]; char *str1 = "abcdefghi";
strcpy(string, str1); printf("%s\n", string); getch(); return 0; } strncpy - копировать не более n символов строки s2. Определение: char *strncpy(s1,s2,n) char *s1, *s2; int n; Пример 6: #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { clrscr(); char string[10]; char *str1 = "abcdefghi"; strncpy(string, str1, 3); string[3] = '\0'; printf("%s\n", string); getch(); return 0; } strlen - определить длину строки (число символов без завершающего нулевого символа). Определение: int strlen(s) char *s; Пример 7: #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { clrscr(); char *string = "Borland International"; printf("%d\n", strlen(string)); getch(); return 0; } strchr - найти в строке первое вхождение символа с. Определение: char *strchr(s,n) char *s; int n; Пример 8: #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { clrscr(); char string[20]; char *ptr, c = 'r'; strcpy(string, "This is a string"); ptr = strchr(string, c); if (ptr) printf("The character %c is at position: %d\n", c, ptr); else printf("The character was not found\n"); getch(); return 0; } strrchr - найти в строке последнее вхождение символа с. Определение: char *strrchr(s,c) char *s; int c; Пример 9: #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { clrscr(); char string[20]; char *ptr, c = 'r'; strcpy(string, "This is a string"); ptr = strrchr(string, c); if (ptr) printf("The character %c is at position: %d\n", c, ptr); else printf("The character was not found\n"); getch(); return 0; } strpbrk - найти в строке s1 любой из множества символов, входящих в строку s2. Определение: char *strpbrk(s1,s2) char *s1, *s2; Пример 10: #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { clrscr(); char *string1 = "abcdefghijklmnopqrstuvwxyz"; char *string2 = "onm"; int *ptr; ptr = strpbrk(string1, string2); if (ptr) printf("strpbrk found first character: %c\n", ptr); else printf("strpbrk didn't find character in set\n"); getch(); return 0; } strspn - определить длину отрезка строки s1, содержащего символы из множества, входящих в строку s2. Определение: int strspn(s1,s2) char *s1, *s2; Пример 11: #include <stdio.h> #include <string.h> #include <alloc.h> #include <conio.h> int main(void) { clrscr(); char *string1 = "1234567890"; char *string2 = "123DC8"; int length; length = strspn(string1, string2); printf("Character where strings differ is at position %d\n", length); getch(); return 0; } strcspn - определить длину отрезка строки s1, не содержащего символы cтроки s2. Определение: int strcspn(s1,s2) char *s1, *s2; Пример 12: #include <stdio.h> #include <string.h> #include <alloc.h> #include <conio.h> int main(void) { clrscr(); char *string1 = "1234567890"; char *string2 = "747DC8"; int length; length = strcspn(string1, string2); printf("Character where strings intersect is at position %d\n", length); getch(); return 0; } strtok - выделить из строки s1 лексемы, разделенные любым из множества символов, входящих в строку s2. Определение: char *strtok(s1,s2) char *s1, *s2; Пример 13: #include <string.h> #include <stdio.h> #include <conio.h> int main(void) { clrscr(); char input[16] = "abc,d"; char *p; p = strtok(input, ","); if (p) printf("%s\n", p); p = strtok(NULL, ","); if (p) printf("%s\n", p); getch(); return 0; }
14. Лекция: Структуры.
-Определение структурных переменных. -Доступ к компонентам структуры. -Поля битов в структурах. -Объединения. -Перечисления. -Переменные структуры. -Указатели структуры. -Массив структур. -Переименования типов.
Дата добавления: 2014-01-05; Просмотров: 364; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |