}
strcat (a, s + n + 1); // добавить имя
strcat (a, " "); // добавить пробел
len = strlen (a); // найти длину строки
strncpy (a + len, s, n); // добавитьфамилию
strcpy (a + len + n, "!"); // добавить "!"
puts (a);
}
Поиск в строках
Когда говорят о поиске в строках, обычно рассматривают две задачи: найти первый заданный символ с начала (или с конца), или также найти заданную подстроку (если она есть).
Первую задачу выполняют функции strchr (поиск с начала строки) и strrchr (поиск с кон-
ца строки), а вторую – функция strstr .
Все эти функции возвращают указатель на найденный символ (или на первый символ
найденной подстроки). Это значит, что переменная, в которую записывается это значение,
должна быть объявлена как указатель на символьную переменную. Мы уже встречались с ука-
зателями, когда работали с файлами. Указатель – это ячейка в памяти, в которую можно запи-
сывать адрес другой переменной.
Структура вызова функций такая: на первом месте – где искать (строка), на втором – что
искать (один символ для функций strchr и strrchr или строка для strstr). Чтобы полу-
чить номер символа с начала строки, надо вычесть из полученного указателя адрес начала мас-
сива. Если поиск завершился неудачно, функции возвращают NULL .
#include <stdio.h>
#include <string.h>
Main()
{
chars1[] = "Мамамылараму",
s2[] = "Война и мир", *p;
p = strchr(s1, 'а');
if (p!= NULL) {
printf("Первая буква а: номер %d", p - s1);
p = strrchr(s1, 'а');
printf("\nПоследняя буква а: номер %d", p - s1);
}
p = strstr(s2, "мир");
if (p!= NULL)
printf("\nНашлимирв %s", s2);
else printf("\nНет слова мир в %s", s2);
}
Вспомните, что при чтении строк из файла с помощью функции fgets на конце иногда остается символ перехода на новую строку '\n'. Чаще всего он совсем не нужен и надо его удалить– поставить на его месте нуль (признак конца строки). Делается это так:
char s[80], *p;
...
p = strrchr (s, '\n'); // ищемсимвол '\n'
if (p!= NULL)// если нашли,...
*p = '\0'; // записываем в это место '\0'
Рассмотрим теперь более сложную задачу.
Пример. С клавиатуры вводится предложение и слово. Надо определить, сколько раз встречается это слово в предложении.
Функция strstr может определить только первое вхождение слова в строку, поэтому в
одну строчку эту задачу не решить.Попробуем использовать такую идею: если мы нашли адрес первого данного слова в строке и записали его в указатель p, то искать следующее слово нужно не сна чала строки, а с адреса p+длина_слова. Повторяем эту операцию в цикле, пока функция strstr может найти слово в оставшейся части строки. Поскольку начало области поиска постоянно смещается с #include <stdio.h>
#include <string.h>
Main()
{ int len, count;
char s[80], word[20],
*p, // указатель на найденное слово
*start; // указатель на начало зоны поиска
puts ("Введите предложение");
gets (s);
puts ("Введите слово для поиска");
gets (word);
len = strlen (word); // находимдлинуслова
count = 0; // счетчик найденных слов
start = s; // в первый раз ищем с начала строки
while (1) {
p = strstr (start, word); // есть ли еще слова?
if (p == NULL) break; // если нет, то выход
count ++; // увеличить счетчик
start = p + len; // сместили начало поиска
}
printf ("В этом предложении %d слов %s", count, word);
}
В конце работы цикла в переменной count, будет записано количество данных слов в предложении. Заметьте, что вместо переменной start можно везде использовать p, результат от этого не изменится.каждым новым найденным словом, адрес оставшейся части надо хранить в отдельной переменной типа «указатель на символ». Реализация может выглядеть так:
#include<stdio.h>
#include<string.h>
Main()
{ int len, count;
char s[80], word[20],
*p, // указатель на найденное слово
*start; // указатель на начало зоны поиска
puts ("Введите предложение");
gets (s);
puts ("Введите слово для поиска");
gets (word);
len = strlen (word); // находимдлинуслова
count = 0; // счетчик найденных слов
start = s; // в первый раз ищем с начала строки
while (1) {
p = strstr (start, word); // есть ли еще слова?
if (p == NULL) break; // если нет, то выход
count ++; // увеличить счетчик
start = p + len; // сместили начало поиска
}
printf ("В этом предложении %d слов %s", count, word);
}
В конце работы цикла в переменной count, будет записано количество данных слов в предложении. Заметьте, что вместо переменной start можно везде использовать p, результат от этого не изменится.
Форматирование строк
В программах часто требуется перед выводом информации сформировать всю строку для
вывода целиком, включив в нее все необходимые данные. Например, сообщение об ошибке выводится стандартной функцией, и в это сообщение надо включить числовые данные. Другой пример – вывод текста в графическом режиме, для которого нет аналога функции printf. В этих случаях необходимо использовать функцию sprintf, которая поддерживает те же форматы данных, что и printf, но записывает результат не на экран и не в файл, а в символьную строку (под нее надо заранее выделить память). Вот как выглядит вывод на экран значения переменных x и y в графическом режиме:
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
Main()
{
chars[80]; // вспомогательнаястрока
intx, y;
// здесь нужно открыть окно для графики
x = 1;
y = 5;
sprintf (s, "X=%d, Y=%d", x, y); // выводвстроку s