Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_лек-3_на рус языке.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
298.5 Кб
Скачать
  1. Strcat(), strncat(). Соеденение строк.

char *strcat(char *s1, char *s2);

добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется \0.

char *strcat(char *s1, char *s2, size_t n);

добавляет не более n символов из строки s2 к s1, если s2 короче s1, то вся строка добавляется, в конец результирующей строки добавляется \0. Тип size_t означает любой целый, например, int, long int и т.д.

Программа объеденяет строки, сначала проверяя их размер. Применяются обе функции

#include <string.h>

#define n_c 40 // поименованная константа

#define n_g 13

int main(void)

{

char cwetok[n_c]; // цветок, длина – 40 (с '\0')

char add_str[]=” имеет жуткий запах.”; // 20 символов

char guk[n_g]; //жук, длина 13 (без \0 - 12)

int len;

puts(“Ваш любимый цветок?”);

gets(cwetok);

if ((strlen(add_str)+strlen(cwetok)+1)<=n_c)

// если длина добавляемой строки и длина введеного цветка вместе не превышают

// 40 (c учетом прописываемого в конце «нуля»), то соеденить эти строки

strcat(cwetok,add_str);

puts(“Ваш любимый жук?”);

gets(guk);

len=n_g-strlen(guk)-1; // такое максимальное кол-во символов мы можем добавить

//к строке guk

strncat(guk,add_str,len);

puts(guk);

puts(cwetok);

return 0;

}

Если на запрос «Ваш любимый цветок?» введём «орхидея» (7 символов) то после добавления add_str будет выведено:

Орхидея имеет жуткий запах.

(7+19+1=27. Это <=40)

Если на запрос «ваш любимый жук?» введём «Жук навозник» (12 символов), то после обьеденения строк будет выведено:

Жук навозник.

Если при этом переопределить #define n_g 21, то после обьеденения будет выведено:

Жук навозник имеет ж

(всего 20 символов, 21 это ‘\0’)

имеет ж

2-а. sprintf(). Соеденение строк.

sprintf() – соеденение строк, работает так же как и printf, только выводит не на экран, а прописывает в массив символов в определенном формате несколько значений, тем самым объединяя их, имя этого массива- это 1-й параметр sprintf().

Пример. Объединим в одну строку 2 введенные строки – фамилию и имя и одно введенное число.

#include <stdio.h>

#define max 20

int main()

{ char name[max]; Будет выведено:

c

Введите имя:

Макс

Введите фамилию:

Иванов

Введите сумму:

20000

Иванов Макс: $20000.0

har fam[max];

char res[2*max+10];

float sum;

puts(“Введите имя: ”);

gets(name);

puts(“Введите фамилию: ”);

gets(fam);

puts(“Введите сумму: ”);

scanf(“%f”,&sum);

sprintf(res,”%s,%-19s:$%6.2f”,fam,name,sum);

puts(res);

return 0;

}

3. strcmp(), strncmp() – сравнивание строк (посимвольное, до 1-го несовпадаю-щего).

int strcmp(char s1,char *s2) – сравниванивает строки s2 и s1, пока не найдет отличающийся символ и возвращает : отрицательное, если s1<s2,

положительное, если s1>s2,

возвращает 0, если s1=s2.

int strncmp(char *s,char *s2, size_t n); в отличии от strcmp() сравнивает не до тех пор, пока не найдет отличающийся символ, а до тех пор, пока они будут отличатся, или пока не сравнится n символов.

Обе функции возвращают разность между значениями кодов ASCII.

В таблице кодов ASCII сначала большие латинские буквы, потом малые.

Пример. Strcmp()

#include <stdio.h>

#include <string.h>

int main() // будет выведено:

{ printf(“%d\n”,strcmp(“A”,”A”)); // 0

printf(“%d\n”,strcmp(“A”,”B”)); //-1

printf(“%d\n”,strcmp(“C”,”A”)); //2

printf(“%d\n”,strcmp(“Z”,”a”)); //-7 (т.к больше буквы реньше малых в

// ASCII)

printf(“%d\n”,strcmp(“муля”,”мул”)); //115 (т.к «я» сравнивается с '\0')

return 0;

}

Сравниваются не символы а строки, т.е. не 'A' и ‘A’, а строка“A” и строка“A“.

Пример. strncmp(). Например найти строки начинающиеся с «астро». Сколько их?

#include <stdio.h>

#include <string.h>

#define d 4

int main()

{ char *slov[d]={“астрономия”,”опытный”,”астрофизика”,”звезда”}; //это масив

// строк

int i, kol = 0; // кол-во строк начинающихся с «астро»

for (i=0; i<=d-1; i++)

if ( strncmp ( slov [ i ], ”астро” , 5 ) = = 0 )

{ printf ( “ \ n % s ” , slov [ i ] ) ; Будет напечатано:

kol + + ; астрономия

} астрофизика

printf(“\nКол-во совпадений= %d.”,kol); кол-во совпадений = 2.

return 0;

}

4. strcpy() и strncpy()- копирование строк.

char *strcpy(char *s1,char *s2); копирует s2 в s1 и возвращает s1, '\0' тоже копируется.

char *strncpy(char *s1, char s2, size_t n); копирует не более n символов из s2 в s1 и возвращает s1. Если '\0' в строке встретился раньше, то копирование прекращается, а оставшиеся до n символы заполняются \0'. Если n< или = длине строки s2, то \0' в s1 не записывается.

strcpy() и Strncpy() (так же как и функции сравнения- не проверяют: достаточно ли места в строке s1 для s2. Если нет, то поведение программы не определено).

Пример strcpy(). С клавиатуры вводить слова, пока не будет введено 5 слов начинающихся с 'д'. Сохранить их в массив слов.

#include <stdio.h>

#include <string.h>

# define max 10 // максимальная длина вводимого слова.

#define k 5 // кол-во слов, начинающихся с «д»

int main()

{ int i=0;

char m_slov[k][max]; // массив слов, начинающихся с «д»

char slovo[max]; // вводимое клавиатуры слово

while ((i<k)&&(gets(slovo)) // если i<5 и нет ошибок при вводе слова то

{ if (slovo[0]!=’д’) printf(“\n ! %s не начинается с «д»!”,slovo);

else {strcpy(m_slov[i],slovo); // (использование strncpy() смотри ниже)

}

}

for (i=0;i<k,;i++) // вывод слов начинающихся с «д»

puts(m_slov[i]);

return 0;

}

Будет на экране:

при вводе: при выводе:

дом

дым

дрова

сало

! сало не начинается с «д»

дыра

дерево

дом

дым

дрова

дыра

дерево

Использование strncpy() для этой задачи:

{strncpy(m_slov[i], slovo, max-1); // копирование не более 9 символов

m_slov[max-1]=’\0’; // это нужно делать т.к. если слово длинее, чем

} // max-1 то \0 не будет скопирован

Схема strcpy() (она использует указатели)