Основы программирования на языке C

         

Массив и указатель: различия


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

static char heart[ ] = "Я люблю язык Cи!"; char *head = "Я люблю язык Pascal!";

Основное отличие состоит в том, что указатель heart является константой, в то время как указатель head - переменной. Посмотрим, что на самом деле дает эта разница.

Во-первых, и в том и в другом случае можно использовать операцию сложения с указателем:

for(i=0;i<7;i++) putchar(* (heart+i)); putchar('\n'); for(i=0;i<7;i++) putchar(* (head+i)); putchar('\n');

В результате получаем

Я люблю Я люблю

Но операцию увеличения можно использовать только с указателем:

while ((*head) != '\0') /* останов в конце строки */ putchar(*(head++)); /* печать символа и перемещение указателя */

В результате получаем:

Я люблю язык Pascal!

Предположим, мы хотим изменить head на heart. Можно так:

head=heart; /* теперь head указывает на массив heart */ но теперь можно и так heart = head; /* запрещенная конструкция */

Ситуация аналогична x = 5 или 5 = x. Левая часть оператора присваивания должна быть именем переменной. В данном случае head = heart, не уничтожит строку про язык Cи, а только изменит адрес , записанный в head.

Вот каким путем можно изменить обращение к head и проникнуть в сам массив:

heart[13] = 'C';

или

*(heart+8)='C';

Переменными являются элементы массива, но не имя!



Обработка строк

Для выполнения описанных в этом подразделе функций необходимо включить в программу файл 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; }



Строковые константы




Строковая константа представляется последовательностью символов кода ASCII, заключённой в кавычки: "...". Она имеет тип char[].

Примеры:

"This is character string" "Это строковая константа" "A" "1234567890" "0" "$"

В конце каждой строки компилятор помещает нулевой символ '\0', отмечающий конец данной строки.

Каждая строковая константа, даже если она идентична другой строковой константе, сохраняется в отдельном месте памяти.

Если необходимо ввести в строку символ кавычек ("), то перед ним надо поставить символ обратной косой (\). В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ \.

Символ \ и следующий за ним символ новой строки игнорируется.

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

/* Строки в качестве указателей */ main( ) { printf("%s, %u, %c\n", "We", "love", *"Pascal"); }

Итак, формат %s выводит строку We. Формат %u выводит целое без знака. Если слово "love" является указателем, то выдается его значение, являющееся адресом первого символа строки. Наконец, *"Pascal" должно выдать значение, на которое ссылается адрес, т.е. первый символ строки "Pascal".

Вот что выдаст наша программа:

We, 34, P



Ввод-вывод строк


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;