Return 1; // выход по ошибке, код ошибки 1

}

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: