programmirovanie / ОПиАЯ_№3_5
.doc3.4 СТРОКИ
printf(“Введите значениеa%d”,a);
Пример 1
(“Введите значение a %d”,a);
строковая const
21 символ, в т.ч.””
Пример 2.
#define ERR RPINT “***Error”
Объявление и инициализация строковых переменных.
Строки представляются в виде массивов типа char
Пример:
char string var[ 30 ];
/*строка длиной [0 – 29] символов */
char V[ ] = {‘A’,’E’,’I’,’O’,’U’};
/*V[5] */
char V[5] = “AEIOU”;
char str[20] = “strokov”;
Размещение в ОП массива str
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [19]
s t r o k o v \0 ? ? …
str [7] содержит нулевой символ (NULL) “\0”, отмечающий конец строки.
Использование маркера конца строки позволяет длине строки в символьном
Массиве варьироваться от 0 и до размера на единицу меньше, чем объявленный. Все функции обработки строк игнорируют все, что хранится в ячейках после нулевого символа.
MAX возможная длина массива str
0 1 2 3 18 19
\0
19 символов
Массивы строк – двумерный массив символов, в котором каждый ряд является одной строкой.
Пример: массив для хранения 30 фамилий, каждая из которых 25 символов длиной.
#define N NAM 30
#define N LEN 25
…
char names [N NAM][N LEN]
Пример:
Char month[12][10] = {“Jan”,”Feb”,”March”,”April”,”May”,”Jun”,”Jul”,”Aug”,
“Septem”,”Okt”,”Nov”,”Dec”};
Ввод – вывод символов %S
Printf (“месяцы : %S”,montch[][])
Спецификации
Пример ввода:
Char d[10];
…
scanf (“%S”,d);
printf(“%S”,d);
При вводе пропускаются пустые символы (“пробел”,TAB,символ новой строки). Начиная с первого значащего символа scanf копирует встречающиеся символы в последовательные ячейки памяти. Когда встречается “пробел”, сканирование останавливается и scanf добавляет null в конце строки.
Пример: char d[10]
[0] [1] [2] [3] [4] [5] [9]
С Л О В О \0 ? ? ? ?
Данные ввода: СЛОВО
Лучшие стандартные функции!!!
#include <string.h>
/*библиотека для работы со строковыми переменными*/
Пример ввода:
strassign (d,”слово”,10);
/* функция присвоения строк*/
char d[ ] - выходная строка-приемник
const char src[ ] - входная строка-источник
int dest_len - максимальная длина.
int strlen (char src[ ])
входной аргумент-строка возвращает количество
символов без “\0”
int k; char d[ ] = {‘И’,’М’,’Я’};
k = strlen (d);
char substr( char dest[ ], /*выходная строка назначение*/
const char src[ ], /*входная строка-источник*/
int st, /*входной индекс 1-го символа в src[ ]*/
int enol, /*индекс следующий за последним включаемым*/
int dest_len) /*входной дополнительный параметр в dest*/
Пример:
char last[20], f[20], m[20];
char pr[20] = “Adams, Johp, Quinly”;
01234
substr(last, pr, 0, 5, 20)
substr(f, pr, 7, 11, 20)
Функции преобразования данных
Прототипы в <stdlib.h>
Пример: int строка
Преобразуют в строку символов “123”
itoa (123, S, 10) int
ltoa (123L, S1, 10) long int
123 S[0] 1
[1] 2
[2] 3
Пример: строка число
int k1;
…
k1 = atoi(“123”) 123 (int)
atol(“123”) 123 (1.2310)
atof(“123”) 123 (число 1.230000Е+02)
Пример: реверсирование строки S
#include <stdio.h>
const Ls = 81;
main ( )
{char S[Ls], R;
int L, I;
printf (“\n введите S”);
gets (S);
printf (“\n исх.строка%S”, S);
for (L = 0; S[L] != ‘\0’; L++);
for(I = 0; I < L/2; I++)
{R = S[I];
S[I] = S[L-I-1];
S[L-I-1] = R;}
printf (“\n рев.строка:%S”,S);
}
Эквивалент.
#include <stdio.h>
#include <string.h>
main ( )
{ char *S;
…
gets (S);
printf (“\n исх.строка%S”,S);
strrev (S);
printf( “\n рев.строка %S”,S);
}
Строковые функции СИ.
Пример инициализации char – массива
char S[ ] = “Мир!”;
char S[ ] = “Мир!”;
char S[ ] = {‘М’,’и’,’р’,’!’,’\0’};
Строковая константа участвует в инициализации указателя типа char*,
адрес 1-го символа константы есть начальное значение указателя.
Пример:
char *S = “Разрешить…”;
S – переменная – указатель, начальное значение S равно адресу 1-го символа “P” (сама константа находится в сегменте данных загрузочного модуля программы)
int A[3], *P;
P = A или P = &A[0];
*(P + 2) ссылка на 3-й элемент массива S
*(P + 2) A[2]
Протптипы строковых функций в заголовочном файле <string.h>
Функция strlwr( )
Пример:
strlwr (“ClrScr”) прописные в строчные
результат: строка “ClrScr” для латинского алфавита
Пример:
strupr (“file”)
результат: строка “FILE”
Операндами отношений могут быть символы.
Пример:
“ T “ > “ D “ истина, так как код “ T “ = 146, а “ D “ = 132
Функция strcmp( ) сравнивает строку1 со строкой2, различая прописные и строчные.
Пример:
strcmp ( “Тигр”,”Днепр”);
str1 str2
возвращает int = 0, если строки одинаковые
0, если str1 > str2
< 0, если str1 < str2
int K;
K = strcmp ( “ T “, “ D “ );
результат : К = 14 = 146 – 132
Пример:
Stricmp (“ Russia”, “RUSSIA”);
Сравнивает, не различая регистры. Код возврата = 0.
“Склейка”
Пример:
SS = strcat( “Марк”, “шейдер”);
Результат: “Маркшейдер”.
Пример:
str1 str2
S = strncat ( “ ”, “политехник”, 4);
Присоединяе 4 символа из str2 в конец str1
S = strncat ( S,”шинель”,6);
Результат : “полишинель”.
Пример:
int Len;
Len = strlen(“Скоро_ссесия”);
Результат Len 12
Пример:
S = “Длинношеее”;
S1 = “Георгий”;
5 симв.
Результат: S = “Георгошеее”;
5симв.
-
S [5] = ‘\0’;
-
Результат S = “Георг”;
Пример:
char strstr (“ исидора”, “сидор”);
результат: “сидор”, если входит и NULL , если не входит.
Пример реверса:
char strrev (“хорош”);
результат : ” шорох ”.
SIMVOL.C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main( )
{ char S[ ] = “YPA!”;
char S1[5] =”BYE”;
char S2[6] = {‘X’,’A’,’-‘,’X’,’A’,’\0’};
char *S3;
char S7[50];
char d[100], d1[100];
int I, j;
clrscr( );
S3 = “DON”;
printf(“S = %s”, S); S = YPA!
printf(“\nS1 = %s”,S1); S1 = BYE
printf(“\nS2 = %s”,S2); S2 = XA-XA
printf(“\nS3 = %s”,S3); S3 = DON
gets(S7); /*c probel*/ 12345_7<enter>
printf(“\nnklan S7 = %s”,S7); S7 = 12345_7
strcpy(S7,”ffff”);
printf(“\nnstrcpy S7 = %s\n”,S7);
scanf(“%s”,S7); /*bez probel*/ 456_789
printf(“\nprintf S7 = %s”,S7); = 456
/*kod simvola*/
printf(“\n kod simvola ‘%c’ %d”, ‘T’, ‘T’); код simvola ‘T’_84
/*strassign(d, “slovo”, 6);*/
i = strlen(S1);
printf(“\nkol-vo simvolov S1 = %d”, i); = 3
printf(“\nkol-vo simvolov S2 = %d”, strlen(S2)); = 5
getch( );
printf(“\n\n %s”, strlwr(“RiRi”)); riri
strcpy(d, “File”);
printf(“\n\n %s”, strupr(d)); FILE
strcpy(S7, “file”);
printf(“\n\n srav d S7 %d”, strcmp(d, S7)); /*-32*/
printf(“\n\n srav d S7 %d”,stricmp(d,S7)); /* 0 */
getch( );
printf(“\n\n %s”,strcat(d,S7)); FILEfile
printf(“\n%s”,strncat(“”,”politex”,$)); poli
strncat(d,”cat”,2);
printf(“\n\n %s”,d); FILEfileca
strcpy(S7,”yyyyyyy”);
strncpy(d,S7,3); в начало замена “yyy”
printf(“\n\n d= %s”,d); = yyyEfileca
d[3] = ‘\0’;
printf(“\n d= %s”,d); = yyy
clrscr();
printf(“\n\n %s”,strstr(“pole”,”le”)); le (при вхождении строки
“le” в строку “pole”
if(strstr(“jki”,”1”) == NULL)
str1 str2 не входит str2 в str1
printf(“\n mesto bxoda NULL”);
printf(“\n %s”,strrev(“asdf”)); fdsa
strcpy(d,strrev(“qwer”)); присвоение
printf(“\n d= %s”,d); d = rewq
itoa(123,d,10);
printf(“\n d= %s”,d); d = 123
printf(“\n %f”,atof(“456”)); 456.000000
getch( );
}
substr (S7, S1, 0, 3, 10);