Язык Си - руководство для начинающих
Шрифт:
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)).