Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема8_Строки.doc
Скачиваний:
1
Добавлен:
23.11.2018
Размер:
148 Кб
Скачать
☆

Ввод и вывод строк

Вывести строку на экран можно не только с помощью функции printf(). Самый простой способ вывода строки – воспользоваться функцией puts():

puts(myString);

Библиотека string.H

При работе со строками часто возникает потребность выполнить одно из стандартных действий: объединить две строки в одну, определить длину строки, сравнить две строки согласно алфавитному порядку, проверить наличия заданного символа в строке и некоторые другие. Все эти функции можно реализовать самостоятельно, поскольку они довольно простые, например, функция определения длины строки может выглядеть следующим образом:

int length(char myString[]) {

int i = 0;

while (myString[i] != '\0') {

i++;

}

return i;

}

Однако эти функции могут встречаться настолько часто, что их было решено реализовать и включить в стандартную библиотеку, которая называется string.h. Далее мы рассмотрим наиболее распространенные функции из этой библиотеки.

Определение длины строки – функция strlen()

Функция strlen() определяет длину строки.

puts("Enter a string: ");

gets(myString);

printf("Length = %d\n", strlen(myString));

char myString[40];

puts("Введите строку: ");

gets(myString);

puts("\nСтрока наоборот:");

for (int i=strlen(myString)-1; i>=0; i--) {

putchar(myString[i]);

}

Присвоение (копирование строк) – функция strcpy()

char string1[] = "Привет";

char string2[30];

puts("Строка1 =");

puts(string1);

strcpy(string2, string1);

puts("Теперь строка2 =");

puts(string2);

Объединение двух строк – функция strcat()

char full_name[50];

char first_name[30];

char second_name[30];

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

gets(first_name);

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

gets(second_name);

//Вначале строка пустая

strcpy(full_name, "");

//Присоединяем имя

strcat(full_name, first_name);

//Присоединяем пробел

strcat(full_name, " ");

//Присоединяем фамилию

strcat(full_name, second_name);

puts("Полное имя:");

puts(full_name);

Сравнение строк в алфавитном порядке – функция strcmp()

Проверка наличия символа в строке – функция strchr()

char word[40];

char letter;

puts("Введите слово:");

gets(word);

puts("Введите букву:");

letter = getchar();

if (strchr(word, letter) != NULL) {

puts("Буква есть в слове.");

} else {

puts("Буквы нет в слове.");

}

Передача строк в качестве аргументов функций

Строки – это массивы символов, поэтому они передаются в функции так же, как и массивы. Отличие заключается в том, что передавать длину строки не нужно, так как строки заканчиваются нуль-символом, благодаря которому конец строки или ее длину можно определить.

Рассмотрим этот механизм на примере. Напишем функцию, которая принимает в качестве аргумента строку и возвращает количество цифр в этой строке. Под цифрой будем понимать один из символов от ‘0’ до ‘9’. Алгоритм этой функции достаточно прост: нужно объявить переменную, которую инициализировать нулем, и пробежаться по всей строке, символ за символом, инкрементируя эту переменную, если символ является цифрой. Как определить, является ли символ цифрой? Перед ответом на этот вопрос заметим, что данную проверку будет разумно вынести в отдельную функцию, назовем ее isDigit(), которая принимает строку и возвращает true или false в зависимости от результата проверки. Согласно кодировке символы, отвечающие за цифры, идут один за другим. Проверьте это, выведя значения этих символов с помощью спецификатора целого числа:

const char digits[] = "0123456789";

printf("-----------------------\n");

printf("|%6s %3s|", "Символ", "Код");

printf("%6s %3s|\n", "Символ", "Код");

printf("-----------------------\n");

for (int i=0; i<strlen(digits); i+=2) {

char dgt = digits[i];

printf("| \'%c\' %-3d|", dgt, dgt);

dgt = digits[i+1];

printf(" \'%c\' %-3d|\n", dgt, dgt);

}

printf("-----------------------\n");

Используя это наблюдение, функцию isDigit() можно реализовать следующим образом:

bool isDigit(char symbol) {

return '0'<=symbol && symbol<='9';

}

Записи '0'<=symbol и symbol<='9' подразумевают, что символы заменяются на их числовые значения согласно установленной кодировке, а затем производится сравнение.

Желающие действовать «в лоб» могут довольствоваться другой реализацией:

bool isDigitV2(char symbol) {

const char digits[] = "0123456789";

for (int i=0; i<strlen(digits); i++) {

if (symbol==digits[i]) {

return true;

}

}

return false;

}

Используя реализованную функцию проверки, является ли символ цифрой, функция подсчета количества цифр в строке принимает лаконичный и понятный вид:

int getNumberOfDigits(char symbols[]) {

int n_digits=0;

for (int i=0; i<strlen(symbols); i++) {

if (isDigit(symbols[i])) {

n_digits++;

}

}

return n_digits;

}

Обратите внимание на то, что поскольку функция isDigit() возвращает значение логического типа, то в условии сравнений уже не нужно. Вызвать написанную функцию можно так:

char str[50];

printf("Введите строку:\n");

gets(str);

printf("Количество цифр равно %d\n",

getNumberOfDigits(str));