Як вводити рядки або виводити їх на екран

Виводитись рядок може або вже відомою вам функцієюprintf( )зі специфікатором введення"%s", або спеціальною функцією int puts (char *string), яка виводить рядокstringна екран і повертає деяке ненульове значення у разі успіху.

Навіщо потрібний специфікатор "%s"? Це робиться для того, щоб можна було виводити рядки з будь-якими символами. Порівняйте:

Приклад:

char str [] = "Захотілося мені вивести %d.";

printf ("%s", str); /* Правильний варіант */

printf ("\n"); /* Розділювач нового рядка */

printf(str); /* Неправильний варіант */

У першомувипадку функція надрукує саме те, що потрібно. А ось удругомувипадкуprintf(), зустрівши в рядкуstrспецифікатор "%d" (адже тепер цей рядок – перший, значить, він задає формат виводу ), зробить висновок, що за нею має йти число. Оскільки воно не слід, то замість "%d" буде надруковано деяке сміття - число, що знаходиться в той момент у стеку.

Наслідки можуть бути і більш серйозними, якщо в рядку знаходиться послідовність"%s",то визнає її за рядок, і виводитиме її доти, доки не зустріне нульовий символ. А де вона його зустріне, скільки встигне надрукувати і чи не crash'не через звернення не до своєї пам'яті – не знає ніхто.

Угоду про ознаку закінчення рядка потрібно дотримуватись, формуючи у програмах рядки з окремих символів. Як приклад розглянемо таку

Приклад: Необхідно зберегти введений рядок.

/*читання рядка з терміналу*/

int getline(chars, / *введений рядок*/

int lim) /*її максимальна довжина*/

9.5Введення-виведення рядків.Основні функції роботи з рядками

Однією з найпопулярніших операцій введення-виведення є операція введення-виведення рядка символів. У бібліотеку мови СІ для обміну даними через стандартні потоки введення-виведення включені функції введення-виведення рядківgets()іputs(),які зручно використовувати при створенні діалогових систем.

Длявведення рядкаіснує функція з прототипом

char *gets (char *string),

яка зчитує рядок з клавіатури та поміщає її в буферstring, покажчик на який і повертає. Якщо виникла помилка, то повертається EOF.

Функція має лише одинаргумент – покажчикsна масив символів. Прототип функції описаний у файлі.

Функція gets()завершує свою роботу при введенні символу'\n', який автоматично передається з клавіатури в ЕОМ при натисканні клавіші . При цьому сам символ'\n'у рядок, що вводиться, не записується. Замість нього в рядок міститься нуль–символ'\0'. Таким чином,функція gets() здійснює введення “правильного” рядка, а не просто послідовності символів.

Тут слід звернути увагу на таку особливість введення даних із клавіатури. Функціяgets()починає обробку інформації від клавіатури тільки після натискання клавіші.Таким чином, вона “очікує”, доки не буде набрано потрібну інформацію та натиснуто клавішу . Тільки після цього починається введення даних у програму.

Приклад: #include

printf ("Input a string:");

printf ("The string input was: %s\n", string);

Функціяputs()(виведення рядкана екран) у разі успішного завершення повертає останній виведений символ, який завжди є символом'\n', якщо сталася помилка, топовертається із функції EOF. Прототип цієї функції має такий вигляд:

int puts (char * s); /*функція виведення рядка*/

Функція має лише одинаргумент – покажчикsна масив символів. Прототип функції описаний у файлі.

Наведемо найпростішийприклад використання цих функцій.

char strl[] = ”введіть прізвище співробітника:”;

Нагадаємо, що будь-який рядок символів у мові СІ повинен закінчуватися нуль-символом'\0'. В останній елемент масивуstrlнуль-символ буде записано автоматично під час трансляції під час ініціалізації масиву. Для функціїputs()наявність нуль-символу в кінці рядка є обов'язковою.

Приклад: #include

char string[] = "This is an example output string\n";

9.5Функції маніпуляції з рядками

Так як у Cі немає зумовленого типу для рядка, то немає і настільки звичних багатьом операцій, як порівняння та склеювання рядків, реалізованих у багатьох мовах як оператори складання та порівняння. Тут додавання масивів неприпустимо, а при порівнянні будуть порівнюватися не самі рядки, а лише покажчики на них, що нам, звичайно ж, нецікаво.

Для маніпуляцій із рядками існує набір функцій, оголошених у файлі (ті, хто пише під Windows, можуть включати замість нього файл).

Найбільш важливі функції:

I. int strcmp (char *string1, char *string2)

здійснюєпорівняння двох рядків.Повертаєвід'ємне число, якщо перший рядок менший за другий, 0, якщо рядки рівні і позитивне число, якщо перший рядок більший за другий. Більш детально, функція повертає різницю між кодами перших неоднакових символів, що зустрілися (якщо рядки неоднакові по довжині, то колись ненульовийсимвол порівнюватиметься з нулем).

Приклад:

char * buf1 = "aaa", * buf2 = "bbb", * buf3 = "ccc";

ptr = strcmp (buf2, buf1);

printf("buffer 2 is greater than buffer 1 \n" );

printf("buffer 2 is less than buffer 1 \n");

ptr = strcmp(buf2, buf3);

printf("buffer 2 is greater than buffer 3\n");

printf("buffer 2 is less than buffer 3\n" );

На екрані з'явиться:

buffer 2 is greater than buffer 1

buffer 2 is less than buffer 3

ІІ. char *strcpy (char *dest, char *source)

Приклад: #include

char *str1 = "a b c d e f g h i";

strcpy (string, str1);

printf("%s\n", string);

На екрані з'явиться: a b c d e f g h I

III. char *strcat (char *string1, char *string2)

здійснюєсклеювання двох рядків. Другий рядок додається до кінця першого. Функція не перевіряє (та й не може перевіряти технічно) наявність необхідної кількості пам'яті наприкінці першого рядка – про це повинні подбати ви. Функція повертає покажчик на перший рядок.

Приклад:

char *blank = "", *c = "C++", *turbo = "Turbo";

strcpy (destination, turbo); //Копіювання рядка "turbo"

на місцеdestination

strcat (destination, blank); // Склеюванняdestination …

strcat (destination, c); // спочатку зblank, потім зc

На екрані з'явиться: Turbo C++

IV. int strlen (char *string)

повертаєдовжину рядкаstring(за винятком нульового символу).

V. char *strdup (char *string)

створюєдублікат рядкаstringі повертає покажчик на нього. Врахуйте, що на відміну від інших функцій,strdupсама створює рядок і тому після того, як вона стала вам не потрібна, не забувайте її звільнити.

VI. char *strncpy ( char *dest, char *source, int count)

VII. char *strncat (char *string1, char *string2, int count)

аналогічноstrcpyтаstrcat, але копіюються лише першіcountсимволів. Функції не додають до рядка завершального нуля – вам доведеться зробити це самим.

VIII. char *strchr (char *string, int c)

IX. char *strstr (char *string, char *substring)

Приклад:

strcpy (string, "This is a string");

ptr = strchr(string, c);

printf("The character %c is at position: %d\n", c, ptr-string);

printf("The character was not found\n");

На екрані з'явиться: The character r is at position: 12