Всякий раз, когда компилятор встречается с чем-то заключённым в кавычки, он определяет это как строковую константу. Символы+’\0′ запи-сыватся в последовательные ячейки памяти. Если необходимо включить кавычки в символьную строку, нужно поставить впереди \».
Строковые константы размещаются в области данных. Вся фраза в кавыч-ках является указателем на место в памяти, где записана строка. Это аналогично имени массива, служащего указателем на адрес расположения массива. Для вывода символьной константы служит идентификатор %s.
char mas[] = «Это одна строка»;
mas — адрес строки ? &m[0] *mas==’Э’.
Можно использовать указатель для создания строки.
char *str = «Таблица результатов»;
char str[]= «Таблица результатов».
Сама строка размещается в области данных, а указатель инициализируется адресом.
void main(void){
char* mesg=»Ошибка чтения»;
char* copy;
copy = mesg; создается второй указатель на строку.
printf («%S», copy); //%u ©
printf («%S», mesg); //%u &mesg
}
char* name;
scanf («%S», name); //Можно ли так??? Будет запорчена память.
char name [81]; //Нужно в начале определить массив
Массивы символьных строк.
Автоматические массивы нельзя инициализировать в Си. Поэтому строки в них записываются при вводе с клавиатуры
char mas[80+1];
scanf(«%S»,mas);
Если требуется несколько строк, то организуем цикл ввода
char mas[4][81];
for (i=0; i<4; i++)
sсanf(«%S», mas[i]); // &mas[i][0]
Иницианизировать можно только внешние или статические массивы.
char m1[] = «Только одна строка»; — автоматически определяется
длинна строки + 1 байт на ‘\0’.
Размер массива можно задать явно.
char m2[50] = «Только одна строка»; //18+1
char m3[]={‘c’, ‘m’, ‘p’, ‘o’, ‘k’, ‘a’, ‘\o’};
char masstr[3][16]={«Первая строка»,
«Вторая строка»,
*masstr[0]==’П’; «Третья строка» };
*masstr[1]==’B’;
*masstr[2]==’Т’;
static char *masstr[3]= {«Первая строка»,
«Вторая строка»,
«Третья строка» };
Однако в этом случае организуется рваный массив. Длина строк раз-ная. Зря не расходуется память.
Массивы указателей
int* parray[5]; 5 указателей на целые значения.
*parray[3] — 3-й элемент массива.
char *keywords[5]={«ADD», «CHANGE», «DELETE», «LIST»,
«QUIT»};
В памяти keyword[0] – адрес 10000 строка ADD\0 4б
keyword[1] — 10004 CHANGE\0 7б
keyword[2] — 10011 DELETE\0 7б
for (i=0; i<5; i++)
printf(«%S», keywords[i]);
char *key[3],**pt; //определение указателя на указатель
pt=key;
printf(«%s %d\n»,*pt,**pt); //распечатывается первая строка и код
//первой буквы
Указатель как возвращаемое значение функции
#include<string.h>
char* strcopy(char*, char*);
void main(void){
char target [24];
char* cptr;
cptr=strcpy (target, «Персональная»); t+12
cptr=strcpy (cptr, «IBM»); t+16
}
char*strcpy (char*tptr, char*cptr){
while (*tptr++=cptr++); //while (*cptr!=’\0′)
// *tptr++=*cptr++;
return (tptr);
}
Передача указателя как аргумента функции
strcat(char* tptr,char* sptr) {
while (*tptr!=’\0′) tptr++; //опред. конца 1 строки
while (*tptr++=*sptr++); //дозапись
}
void main(void) {
char target[81]=” Персональная ”;
char *cptr=»IBM»;
strcat(target,cptr);
}
Функции, работающие со строками
Определены в заголовочном файле stdio.h.
1. Функция gets() — вводит строку в массив с клавиатуры
char name[81];
gets(name); // Берёт все символы до конца строки символ ‘\n’
// отбрасывает и записывает ‘\0’ и передаёт в
// вызов программы.
2. Функция puts() — выводит строку на экран
puts («Я функция puts()»);
char str1[]=»Только одна строка»;
puts(str1); //Читает строку до встречи ‘\0’. Все строки
//выводятся с новой строки.
3. Функция getc() – вводит символ в переменную с клавиатуры.
1. Функция putc() – выводит символ на экран.
Стандартные библиотечные функции
Определены в заголовочном файле string.h.
1. strlen() — опредляет длинну строки без’\0′;
int k = strlen(str1);
2. strcat() — объединяет две строки в одну.
strcat(str1, str2); //результат в первом массиве.
void main (void){
char str1[80]={«Мой любимый цветок»;
char str2[10]=»ромашка»;
strcat(str1, str2); //Чтобы копировать — необходимо проверить,
//чтобы длины массива было достаточно на
//две строки + ноль-байт.
}
char str1[SIZE]=» «;
char str2[]=»ромашка»;
if (strlen(str1)+strlen(str2)< SIZE-1)
strcat (str1, str2)
3.strcmp() — сравнение строк.
# define ANSWER «YES»
void main(void){
char try[10];
gets(try);
puts («Вы студенты 203 группы?»);
while (strcmp(try, ANSWER)!=0){
puts («Попытайтесь ещё раз»)
gets (try);
}
puts(«Верно»);
}
Функция возвращает 0, если строки одинаковы. Сравнение идёт до признака конца строки — ‘\0’, а не до конца массива, или до первого несравнения:
В-А возвращает 1, А-В возвращает -1.
4. strcpy() — копирование строк
#define WORD «Таблица результатов»
void main (void){
char str1[30]; //Длина массива не проверяется
strcpy(str1, WORD)
puts(str1);
}
5. char *strdup(str1) – выделяет память и копирует строку.
1. char *strupr(str1) – преобразует строчные буквы в прописные.
2. char *strlwr(str1) – преобразует прописные буквы в строчные.
3. char *strrev(str1) – реверсирует строку.
4. char *strchr(char *str1, int c) – устанавливает позицию первого вхождения символа с.
5. char *strrchr(char *str1, int c) – устанавливает позицию последнего вхождения символа с.
6. char *strstr(char *str1, char *str2) — устанавливает позицию первого вхождения подстроки str2 в строку str1.
7. int stricmp(char *str1, char str2) – сравнивает не различая строчные и прописные буквы.
