Выход за пределы строки и отсутствие нуль-символа является распространенными причинами ошибок в программах обработки строк
Преобразование строки в число
Преобразование строк в числа можно выполнить с помощью функций atoi, atol, atof. Обратные преобразования - с помощью функции sprintf.
Функция atoi(s) преобразует строку, содержащую символьное представление целого числа в соответствующее целое число и возвращает это число. Признаком конца числа в строке служит первый символ строки, который не может быть интерпретирован как принадлежащий целому числу. Если преобразование не удалось, возвращает 0.
Функция atol(s) преобразует строку, содержащую символьное представление длинного целого числа в соответствующее целое число.
Функция atof(s) преобразует строку, содержащую символьное представление вещественного числа в соответствующее вещественное число двойной точности.
Для использования функций atoi(s)atol(s) и atof(s) к программе следует подключить заголовочный файл <stdlib.h> предложением #include <stdlib.h>
Пример. Данные об участнике соревнований (номер участника, рост и вес) содержатся в строке символов. Вывести номер, рост и вес.
/* Преобразование строки в число */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
void main()
{
char s[]="10) Рост – 162 см., вес – 63.4кг"; //Строка
int n; // Целое число
long h; // Длинное целое
double w; //Вещественное число
n=atoi(s); //Преобразование в целое
h=atol(&s[11]); //Преобразование в длинное целое
w=atof(&s[26]); //Преоброзование в вещественное число
printf("Участник # %d Его рост %ld и вес %lf\n",n,h,w);
puts("Исходная строка");
puts(s);
puts("Первая подстрока");
puts(&s[11]);
puts("Вторая подстрока");
puts(&s[26]);
getch();
}
Результат выполнения программы:
Участник # 10 Его рост 162 и вес 63.400000
Исходная строка
10) Рост – 162 см., вес – 63.4кг
Первая подстрока
162 см., вес – 63.4кг
Вторая подстрока
Кг
Заметим, что строка определяется адресом ее нулевого символа. Для всей строки s таким адресом является имя строки s. Число 10 в символьном представлении находится в строке s в самом ее начале. Поэтому аргументом функции atoi является строка s. Число 162 в символьном представлении находится в строке s, начиная с позиции 11. Поэтому аргументом функции atol является подстрока строки s, определяемая адресом &s[11]. Число 63.4 в символьном представлении находится в строке s, начиная с позиции 26. Поэтому аргументом функции atof является подстрока строки s, определяемая адресом &s[26].
Поиск подстроки в строке
Функция strstr(s1,s2) выполняет поиск подстроки s2 в строке s1 (первого вхождения подстроки s2 в строку s1). Обе строки должны завершаться нуль-символами. В случае успешного поиска функция возвращает указатель на найденную подстроку. В случае неудачи – NULL.
Пример. Определить, содержится ли строка s2 в строке s1 в качестве подстроки.
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main()
{
const int n=81;
char s1[n],s2[n];
char *p;
clrscr();
puts("s1?"); gets(s1);
puts("s2?"); gets(s2);
p=strstr(s1,s2);
if(p)
{
printf("Подстрока '%s'\n начинается в строке: %s\n",s2,s1);
printf("символом '%c'\nэтим символом начинается подстрока: %s\n",*p,p);
}
else puts("NO");
getch();
}
Заметим, что *p – символ в строке s1, с которого начинается s2;
p – подстрока, начиная с *p до конца строки s1.
Пример выполнения программы
s1?
Скоро ли сессия? Так хочется сдать экзамен по ОАиП!
s2?
чет
Подстрока 'чет'
начинается в строке: Скоро ли сессия? Так хочется сдать экзамен по ОАиП!
символом 'ч'
этим символом начинается подстрока: чется сдать экзамен по ОАиП!
Таблица ASCII кодов, применяемая в системе программирования
Borland C++ 3.1 for DOS
Назад
Сцепление двух строк (конкатенация)
Функция strcat(s1,s2) присоединяет строку s2 в конец строки s1 и возвращает указатель на строку, совпадающий с первым аргументом. При этом сначала из строки s1 удаляется завершающий нуль-символ. В конце новой строки S1 помещается '\0'.
Программист должен сам обеспечить достаточную длину строки s1.
Примеры.
1) char s1[40]="Скоро Новый Год!";
char s2[]="Скоро первая сессия!";
printf(" %s\n",strcat(s1,s2));
Будет получена строка:
Скоро Новый Год! Скоро первая сессия!
2) Вторым параметром является текстовая константа:
char s3[50]="Успешной сдачи";
printf("%s\n\t%s\n",strcat (s3," 1-ой сессии!!!"), s3);
Будет получено две строки:
Успешной сдачи 1-ой сессии!!!
Успешной сдачи 1-ой сессии!!!
3) char s4[35]="Успехов и здоровья";
char s5[]=" в Новом Году!";
char *p;
p=strcat(s4, s5);
printf("%s\n%s\n",s4,p);
Будет получено две строки:
Успехов и здоровья в Новом Году!
Успехов и здоровья в Новом Году!
Функция strncat(s1,s2,n) присоединяет n символов строки, на начало которой указывает s2, в конец строки, на начало которой указывает s1 и возвращает указатель на строку, совпадающий с первым аргументом. Сформированная строка s1 ограничивается '\0'.
Если n больше длины строки s2, то выполняется простая конкатенация.
Определение позиции первого вхождения символа из заданного набора символов
Функция strcspn(s1,s2) сопоставляет каждый символ строки s1 со всеми символами строки, на начало которой указывает s2, и возвращает позицию первого вхождения символа строки s2 в строке s1. Символ '\0' в сравнении не участвует.
Если строка s1 начинается с символа, встречающегося в строке s2, то функция возвращает значение нуль. Если строка s1 не содержит ни одного символа строки s2, то возвращаемое функцией значение совпадает с длиной строки s1.
Примеры.
printf("%d %d %d\n",
strcspn("asdf", "hjyars"), //s1начинается с 'a'
strcspn("asdf", "ghtdu"), //в s1 'd' в позиции № 2
strcspn("asrt", "hj")); // в s1 нет символов s2
Получим:
0 2 4
Здесь 0 и 2 – позиции в строке s1, 4 – длина строки s1.
Cравнение двух строк
Сравнение строк производится посимвольно слева направо. Большей считается та строка, в которой первый несовпадающий символ имеет больший код в кодовой таблице.
Функция strcmp(s1,s2) сравнивает строки s1 и s2 . Возвращает отрицательное значение, если s1<s2, нулевое, если s1=s2 или положительное значение, если s1>s2.
Функция strncmp(s1,s2, n) сравнивает строку s1 и первые n символов строки s2 . Возвращает отрицательное значение, если s1<s2, нулевое, если s1=s2 или положительное значение, если s1>s2.
Пример. Ввести две строки. Вывести их в лексикографическом порядке.
#include<stdio.h>
#include<string.h>
#include<conio.h>
Void main()
{
char s1[20];
char s2[20];
puts("Введите 1-ую строку ");
Gets(s1);
puts("Введите 2-ую строку ");
Gets(s2);
if(strcmp(s1,s2)<0)
{puts(s1); puts(s2);}
else if(strcmp(s1,s2)>0)
{puts(s2); puts(s1);}
else puts("Строки совпадают");
Getch();
}
Результаты выполнения программы:
Введите 1-ую строку
abcdefg
Введите 2-ую строку
abcdefg
Строки совпадают
Введите 1-ую строку
bcdert
Введите 2-ую строку
bccertyu
bccertyu
bcdert
Введите 1-ую строку
rtyu
Введите 2-ую строку
rtdh
rtdh
rtyu
Пример. Сколько раз подстрока s1 содержится в строке s?
#include<stdio.h>
#include<string.h>
#include<conio.h>
Void main()
{
char s[20];
char s1[20];
puts("Введите строку "); gets(s);
puts("Введите подстроку "); gets(s1);
int k=0,i=0;
char *p=s;
int n=strlen(s1);
printf("n=%d %c\n",n,*p);
while(strstr(p,s1) && i<n)
{
k=k+1;
p=p+n+1; printf("%c\n",*p);
}
puts("В строке:");
Puts(s);
printf("%d раз встречается %s\n",k,s1);
Getch();
}
Эта же задача с использованием strncmp
/*Сколько раз подстрока s1 встречается в строке s? */
#include<stdio.h>
#include<string.h>
#include<conio.h>
Void main()
{
char s[20]; //строка
char s1[20]; //подстрока
puts("Введите строку ");
Gets(s);
puts("Введите подстроку ");
Gets(s1);
int k=0, //кол-во встреч
i=0;
int m=strlen(s);// длина s
int n=strlen(s1);//длина s1
printf("m=%d n=%d\n",m,n);
while(i<m)
{
if(strncmp(s1,&s[i],n)==0)
{
k=k+1; i=i+n;
}
else i=i+1;
}
puts("В строке:");
Puts(s);
printf("%d раз(а) встречается %s\n",k,s1);
Getch();
}
Например, в строке “abcdefgcdmnklcdf”
Подстрока “cd” встречается 3 раза