Строки и указатели
Сроки в языке С++ представляют собой массив символов. Поскольку имя массива без индексов является указателем на первый элемент этого массива, то при использовании функций обработки строк им будут передаваться не сами строки, а указатели на них.
Так как все строки в языке С++ заканчиваются нулевым символом, который имеет значение «ложь», то условие в операторе while(*str) будет истинным до тех пор, пока программа не достигнет конца строки.
При использовании функций для работы со строками в большинстве случаев целесообразно применять указатели. Приведем примеры фрагментов программ:
/*Пример собственной функции копирования строки s2 в s1*/
char * strcpy_my (char *s1, char *s2){
char *ptrs1 = s1;
//указатель инициализирован на начало строки
while ((*s1++ = *s2++) != 0);
return ptrs1; //возвращается указатель на строку s1
}
Следующий пример демонстрирует, что использование нулевого ограничителя упрощает различные операции над строками.
/*Пример собственной функции конкатенации*/
char * strcat_my (char *s1, char *s2) {
char *p1, *p2;
p1 = s1; p2 = s2;
while ( *p1 != ‘\0’) p1++; //найти конец 1-ой строки.
//или while ( *p1) p1++;
while ((*p1 = *p2) != 0) {
/*копировать строку р2, пока не будет скопирован нулевой
Ограничитель*/
p1++;
p2++; //Передвинуть указатели к следующему байту
} //или while (( *p1++ = *p2++) != 0);/*.
return s1;
}
Пример 1.
/*Демонстрация работы с указателями и с функциями для обработки строк*/
#include <stdio.h>
#include <string.h>
void main() {
char string[100], temp[100], *result, simvol;
int numresult, res;
/*создает строку "computer program" посредством
использования strcpy и strcat*/
strcpy(string, "computer");
result = strcat(string," program");
printf("1) создали строку\n%s\n",result);
/*находит строку, в которой первый раз обнаружено 'a'*/
simvol='a';
result = strchr(string,simvol);
printf("2) находим в строке первое вхождение символа
\'%c\'\n%s\n",simvol,result);
/* создает копию строки */
result = strcpy(temp,string);
printf("3) создали копию строку\n%s\n",result);
/* находит "a","b","c" в строке */
strcpy(string,"xyzabbc");
res = strcspn(string,"abc");
printf("4) определяем длину заданного сегмента
\n%d\n",res);
/*создает новый указатель на строку для дублирования
строки*/
result = strdup(string);
printf("5) создали новый указатель на строку
\n%s\n",result);
}
В предыдущих примерах рассматривалось присваивание указателю адреса только первого элемента массива. Однако это можно делать и с адресом любого отдельного элемента массива путем добавления символа '&' к индексированному имени. Особенно удобно пользоваться этим правилом при выделении подстроки. Например, следующая программа выводит на экран остаток введенной строки после первого пробела:
Пример 2.
/*Вывести на экран остаток строки после первого пробела*/
#include <stdio.h>
void main() {
char s[80], *p;
int i;
printf("ввести строку: ");
gets(s);
/*найти первый пробел или конец строки*/
for(i=0; s[i] && s[i]!=' '; i++);
p = &s[i];
printf(p);
}
В этой программе p будет указывать либо на пробел, если он есть, либо на ноль, если в строке нет пробелов. Если p указывает на пробел, то программа выведет на экран его и затем остаток строки. Например, если ввести фразу «язык программирования С++», функция printf() напечатает сначала пробел и затем «программирования С++». Если p укажет на ноль, то ничего не выводится на экран.
Пример 3:
//Выводит каждое отдельное слово и подсчитывает его длину
#include<iostream.h>
#include<string.h>
#include<stdio.h>
void main() {
char text[100],*p, *razd=" .,";
int dlina;
puts ("Введите текст ");
gets(text);
p=strtok(text,razd); // Выделение первого слова текста
while (p) { // Пока можно выделить слово
dlina=strlen(p); // Определение длины слова
cout << "\n слово "<< p << " длина = " << dlina <<"\n";
p=strtok(NULL,razd);
//Выделение второго, третьего, и т.д. слов
}
}
Задания
1.Наберите коды программ из Примеров 2 и 3. Выполните компиляцию и запуск программ.
2.Дана строка, в которой слова разделены одним пробелом. Найдите и распечатайте все слова указанной длины n.
3.Дана строка из символов латинского алфавита. Вставьте пробел перед каждой заглавной буквой. Перед первой буквой пробел добавлять не надо. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.
Введите строку символов латинского алфавита:
Дата добавления: 2015-02-16; просмотров: 1048;