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

ЖАНРЫ

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

Д. МАРТИН

Шрифт:

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)).

Из этого примера можно сделать вывод, что strcmp использует два указателя строк в качестве аргументов и возвращает значение 0, если эти две строки одинаковы. Прекрасно, если вы придете к такому выводу.

Хорошо, что Strcmp сравнивает строки, а не массивы. Поэтому, хотя массив try занимает 40 ячеек памяти, а " Грант" - только 6 (не забывайте, что одна нужна для нуль-символа), сравнение выполняется только с частью try, до его первого нуль-символа. Такую функцию strcmp можно использовать для сравнения строк, находящихся в массивах разной длины.

Поделиться с друзьями: