Студопедия

КАТЕГОРИИ:


Архитектура-(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)

S2-константа строка

Главное различие s1-переменная строка,

 

Общее:

Для посимвольного вывода можно пользоваться и методом s1[i], s2[i] и методом *(s1+i), *(s2+i).

Например выведем «Я люблю» из s1 и s2:

 

На экране будет
putchar(‘\n’); // переход строки

Я люблю Я люблю
for (i=0; i<=6; i++)

putchar(s1[i]);

putchar(‘\n’);

for (i=0; i<=6; i++)

putchar(s2[i]);

 

 

Сделаем то же самое другим способом:

 

На экране будет тоже
putchar(‘\n’); // переход строки

Я люблю Я люблю
for (i=0; i<=6; i++)

putchar(*(s1+i));

putchar(‘\n’);

for (i=0; i<=6; i++)

putchar(*(s2+i));

 

Различие:

Операцию «++» можно применять только к указателям:

while (*(s2)!=’\0’) // пока не конец строки

putchar(*(s2++)); // печать символа и увеличение указателя на 1 байт

 
 
Я люблю собак!


Будет выведено:

 

 

*s2 – переменная указатель. Раньше она указывала на константу «Я люблю собак!».

Её можно изменить присвоив этой переменной адрес массива s1: s2=s1;

Теперь s2 указывает на строку «Я люблю кошек!»

 

Массивы строк

Сравним массив указателей на char *fruct и массив символов fruct

 

static char fruct[3][7] = {“Дыня”,”Груша”,”Персик”}

 

 

  Д Ы Н Я \0 \0 \0 \0
  Г Р У Ш А \0 \0 \0
  П Е Р С И К \0 \0
                 

Эти значения можно менять   Занимает 21 байт
Это массив [3] символьных массивов [7], т.е. масив значений типа char содержащий 3 символьных массива

 

static char *fruct[3]= {“Дыня”,”Груша”,”Персик”}

 

Д Ы Н Я \0      
Г Р У Ш А \0    
П Е Р С И К \0  

Это массив указателей char. Содержит 3 адреса.
Эти сроковые константы нельзя изменить занимает 5+6+7=18 байт

 

 

Функции С для обработки строк

(описаны в заголовочном файле string.h)

 

strlen() - определение длины строки

strcat() – объеденение строк

strncat() - объеденение строк, а также sprintf (stdio.h)

strcmp() – сравнивание строк

strncmp() - сравнивание строк

strcpy() – копирование строк

strncpy() – копирование строк

другие функции – кратко.

 

1. strlen(). Определяет длину строки (фактическую, не включая \0)

Например, усечем строку str до указанной длины 13 с помощью функции fit

в программе проверки усечения строк:

 

#include <stdio.h>

#include <string.h> // для строковых функций

void fit(char *str1, unsigned int n1);

 

int main(void)

{ char str[]=”Держите шляпы, хакеры!”;

puts(str);

fit(str,13);

puts(str);

return 0;

}

void fit(char *str1, unsigned int n1)

{ if (strlen(str1)>n1) str1[n1]=’\0’; // в 13 элемент масива записывается конец с

// или: *(str+n1)=’\0’

}

 
 
Держите шляпы, хакеры! Держите шляпы


Будет выведено:

 

2. 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]; Будет выведено:

Введите имя: Макс Введите фамилию: Иванов Введите сумму: Иванов Макс: $20000.0
char 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); // (использование str n cpy() смотри ниже)

}

}

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() (она использует указатели)

 

Другие функции для строк(краткое описание)

 

 

<== предыдущая лекция | следующая лекция ==>
Функции работы со строками и символами | Структуры (struct)
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 514; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.