Чтение онлайн

на главную - закладки

Жанры

Язык Си - руководство для начинающих

Д. МАРТИН

Шрифт:

fit(string, size)

char *string;

int size;

{

if(strlen(string) > size)

*(string + size) = '\0';

}

Проверьте ее в "деле" в этой тестовой программе:

/* тест */

main {

static char mesg[ ] = "Ну, теперь

держитесь, компьютероманы.";

puts(mesg);

fit(mesg, 10);

puts(mesg);

}

Программа выдает:

Ну, теперь держитесь, компьютероманы.

Ну, теперь

Наша функция помещает символ '\0' в одиннадцатый элемент массива, заменяя символ пробела. Остаток массива остается на старом месте, но puts прекращает работу на первом нуль-символе и игнорирует остаток массива.

Функция strcat

Вот что умеет делать функция strcat:

/* объединение двух строк */

#include

< stdio.h>

main

{

static char flower [80];

static char addon[ ] = "ы пахнут старыми ботинками.";

puts(" Назовите ваш любимый цветок." );

gets(flower);

strcat (flower, addon);

puts(flower);

puts(addon);

}

Получаем на экране:

Назовите ваш любимый цветок.

Ирис

Ирисы пахнут старыми ботинками.

Очевидно, что strcat (string concatenation) использует в качестве аргументов две строки. Копия второй строки присоединяется к концу первой, и это объединение становится новой первой строкой. Вторая строка не изменяется.

Внимание! Эта функция не проверяет, умещается ли вторая строка в первом массиве. Если вы ошиблись при выделении памяти для первого массива, то у вас возникнут проблемы. Конечно, можно использовать strlen для определения размера строки до объединения.

/* Объединение двух строк, проверка размера первой */

#include <stdio.h>

#define SIZE 80

main

{

static char flower[SIZE];

static char addon[ ] = " ы пахнут старыми ботинками." ;

puts(" Назовите

ваш любимый цветок. ");

gets(flower);

if((strlen(addon) + strlen(flower) + 1) < SIZE)

strcat (flower, addon);

puts(flower);

}

Мы добавляем 1 к объединенной длине для размещения нуль-символа.

Функция strcmp

Предположим, что вы хотите сравнить чей-то ответ со строкой, находящейся в памяти:

/* Будет ли это работать? */

#include <stdio.h>

#define ANSWER " Грант"

main

{

char try [40];

puts(" Кто похоронен в могиле Гранта?" );

gets(try);

while(try != ANSWER)

puts(" Нет, неверно. Попытайтесь еще раз." );

gets(try);

} puts(" Правильно.");

}

Хотя эта программа и смотрится неплохо, она не будет работать правильно, try и ANSWER на самом деле являются указателями, поэтому сравнение (try != ANSWER) спрашивает не о том, одинаковы ли эти две строки, а одинаковы ли два адреса, на которые ссылаются try и ANSWER. Так как ANSWER и try запоминаются в разных ячейках, эти два указателя никогда не могут быть одним и тем же, и пользователю всегда сообщается, что программа неверна. Такие программы обескураживают людей.

Нам нужна функция, которая сравнивает содержимое строк, а не их адреса. Можно было бы придумать ее, но это уже сделала за нас функция strcmp (string comparision).

Теперь исправим нашу программу:

/* это будет работать */

#includе <stdio.h>

#define ANSWER " Грант"

main

{

char try [40];

puts(" Кто похоронен в могиле Гранта?" );

gets(try);

while(strcmp(try, ANSWER) != 0)

{ puts(" Нет, неверно. Попытайтесь еще раз.");

gets(try);

} puts(" Правильно!");

}

Так как ненулевые значения интерпретируются всегда как "true", мы можем сократить оператор while do while(strcmp(try, ANSWER)).

Поделиться:
Популярные книги

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Ох уж этот Мин Джин Хо 1

Кронос Александр
1. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 1

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Девочка для Генерала. Книга первая

Кистяева Марина
1. Любовь сильных мира сего
Любовные романы:
остросюжетные любовные романы
эро литература
4.67
рейтинг книги
Девочка для Генерала. Книга первая

Ты не мой Boy 2

Рам Янка
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Ты не мой Boy 2

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Вор (Журналист-2)

Константинов Андрей Дмитриевич
4. Бандитский Петербург
Детективы:
боевики
8.06
рейтинг книги
Вор (Журналист-2)

Наследник павшего дома. Том IV

Вайс Александр
4. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том IV

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Барон Дубов 4

Карелин Сергей Витальевич
4. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 4