КАТЕГОРИИ: Архитектура-(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(s1[i]); putchar(‘\n’); for (i=0; i<=6; i++) putchar(s2[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] = {“Дыня”,”Груша”,”Персик”}
static char *fruct[3]= {“Дыня”,”Груша”,”Персик”}
Функции С для обработки строк (описаны в заголовочном файле 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 будет выведено:
Если на запрос «ваш любимый жук?» введём «Жук навозник» (12 символов), то после обьеденения строк будет выведено:
Если при этом переопределить #define n_g 21, то после обьеденения будет выведено:
имеет ж
2-а. sprintf(). Соеденение строк. sprintf() – соеденение строк, работает так же как и printf, только выводит не на экран, а прописывает в массив символов в определенном формате несколько значений, тем самым объединяя их, имя этого массива- это 1-й параметр sprintf().
Пример. Объединим в одну строку 2 введенные строки – фамилию и имя и одно введенное число.
#include <stdio.h> #define max 20 int main() { char name[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() (она использует указатели)
Другие функции для строк(краткое описание)
Дата добавления: 2014-01-11; Просмотров: 514; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |