- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
Пример_2: в main() – строка-указатель; в функции – строка-указатель
//пример_2_1
void convertToUppercase (char *sPtr); int main()
{ char *s1= "pointer"; //s1 - неконстантный указатель на константные данные //s1[3]='q'; ошибка, попытка изменить константные данные
cout <<s1<< endl; convertToUppercase (s1);
cout <<s1<< endl; _getch();
return 0;
}
void convertToUppercase (char *sPtr)
{
while (*sPtr != '\0') { //sPtr - неконстантный указатель на неконстантные данные //*sPtr = toupper(*sPtr); если убрать комментарий – то ошибка выполнения
//Нельзя модифицировать константные данные // если данные не модифицируются, то все работает;
++sPtr;
}
}
Передача в функцию массива строк
Передача в функцию массива строк выполняется как передача массива указателей (этот прием может использоваться и для любых двумерных массивов), поэтому возможна без указания количества строк. Например:
void print (char *m[ ]); int main ()
{char *s[]={"odin", "dwa", "try", 0}; print (s);
_getch(); return 0;
}
void print (char *m[ ]) {for (int i=0; m[i]; ++i)
cout << m[i] <<endl;
}
Примеры работы со строками
Определение длины строки с помощью функции пользователя
int dlina_str (const char*); int main()
{const int MAX = 80; char buffer[MAX]=""; int count = 0;
while (true)
{ cout << "Enter a string < 80 characters:\n";
cin.getline(buffer, MAX); |
//если введена пустая строка, то выход |
if (! strcmp(buffer,"")) break; |
|
count= dlina_str(buffer); |
//вызов функции определения длины строки |
cout << endl << buffer << " " << count << endl;
}
return 0;
}
int dlina_str (const char* buf) {int k=0;
for(; buf[k]; k++); } return k;
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
27 |
|
Реверс строки (перегрузка функций)
//прототип функции реверса строки s
// прототип функции реверса и пересылки строки void rev_str (char *in, char *out); //--------------------------------------------------------------
int main()
{char s1[80], s2[80]; //определение символьных массивов strcpy (s1, "abcdef");
rev_str (s1, s2); cout << s2 <<"\n"; rev_str (s1);
cout << s1 <<"\n"; _getch();
return 0;
}
//--------------------------------------------------------------
//реверс строки по адресу s void rev_str(char *s)
{int i, j; char temp[80];
for (i=strlen(s)-1, j=0; i>=0; i--, j++) temp[j] = s[i];
temp[j] = '\0'; strcpy (s, temp);
}
//--------------------------------------------------------------
//реверс строки in и передача результата по адресу out void rev_str(char *in, char *out)
{ int i, j;
for (i=strlen(in)-1, j=0; i>=0; i--, j++) out[j] = in[i];
out[j] = '\0';
}
Удаление начальных пробелов из строки
#include <string.h> int main ()
{unsigned char sst[80]; unsigned char dst[80]; int i=0, j=0;
cout << "\nInput string" << endl;
while ( (sst[i] = _getch() ) !='\r' ) //посимвольный ввод в массив sst
_putch (sst[i++]); |
//и вывод |
|
sst[i] = '\0'; |
|
//завершение строки |
i=0; |
//пока в строке есть символ и это пробел |
|
while (sst[i] && sst[i] == ' ') |
||
i++; //ищем символ, отличный от пробела |
||
while (sst[i]) |
//если еще не конец строки |
|
dst[j++] = sst[i++]; |
//копируем символы |
dst[j] = '\0'; //если конец копируемой строки sst,то завершаем строку dst cout << "\n" << dst << endl;
_getch(); return 0;
}
Обратите внимание, что пропуск пробелов в строке s, начиная с позиции start,
реализует также цикл:
for (int i=start; isspace(s[i]); i++);
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
28 |
|
Проверка, является ли строка целым числом
int main ()
{ char st[40]; int i;
cout << "\nInput string " << endl; cin >> st;
i=0;
while (st[i] >= '0' && st[i] <= '9')
cout |
|
i++; |
|
<< "string: " << endl; |
есть '\0', если введены только цифры |
||
if (st[i]) |
// st[i] |
||
else |
cout <<"NOT number \n" << endl; |
||
|
|
|
cout <<"YES number\n"<< endl; _getch();
return 0;
}
Проверка, является ли строка 16-ичным целым числом
#include <string.h> int main ()
{
char st[20]; int i;
cout <<"\nInput 16 c/c" << endl; cin >> st;
strupr (st); //преобразует строчные буквы в прописные, <string.h> i=0;
while ((st[i] >= '0' && st[i] <= '9') || (st[i] >= 'A' && st[i] <= 'F'))
cout << "string |
" |
i++; |
; |
||
if (st[i]) |
// |
если st[i] != '\0', то i номер первого ошибочного символа |
cout << "NOT 16" << endl;
else
cout << "YES 16" << endl;
_getch(); return 0;
}
Проверка, является ли строка дробным числом без знака
int main () |
|
|
{ |
|
|
char st[20]; |
|
|
int i=0, ok = 0; |
" << endl; |
|
cout << " \nInput abc.def |
|
|
cin >> st; |
<= '9') |
|
if (st[i] >= '1' && st[i] |
i++; |
|
{ while (st[i] |
>= '1' && st[i] <= '9') |
|
if (st[i] == |
'.' ) |
|
{i++;
if (st[i] >= '1' && st[i] <= '9')
{while (st[i] >= '1' && st[i] <= '9')
i++;
ok = 1;
}
}
} |
|
cout << "string :" << st << endl; |
|
if (st[i] || !ok) |
"NOT abc.def" << endl; |
cout << |
|
else |
" YES abc.def" << endl; |
cout << |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
29 |
|
_getch(); return 0;
}
Перевод двоичного числа в десятичное
#include <string.h> int main ()
{
char bin[16]; long int dec=0; int i, v = 1;
cout << " \nInput number 2c/c (8 bit): " << endl;
cin >> bin; |
|
for (i= strlen(bin)-1; i>=0; i--) |
|
{ |
|
if (bin[i] == '1' ) |
|
dec +=v; |
//вес следующего разряда |
v *=2; |
|
} |
|
cout << "2 :" << bin <<endl; |
|
cout << "10:" << dec << endl; |
|
_getch(); |
|
return 0; |
|
} |
|
Перевод шестнадцатеричного числа в десятичное
#include <string.h> |
|
|
|
int main () |
|
|
|
{char st[5]; |
|
|
|
unsigned int dec; |
// err = 1 – в строке недопустимый символ |
||
int i, v=1, err = 0; |
|||
cout << " \nInput 16 (<=FFFF):" << endl; |
|
|
|
cin >> st; |
|
|
|
strupr (st); |
|
|
|
dec=0; |
|
|
|
for (i= strlen(st) -1; i>=0; i--) |
|
|
|
{ if (st[i] >= '0' && st[i] <='9' ) |
|
//(int) '0' = 48 и т.д. |
|
else |
dec +=v * (st[i]-'0'); |
||
|
|
//(int) 'A' = 65 и т.д. |
|
if (st[i] >= 'A' && st[i] <='F' ) |
|||
else |
dec +=v * (st[i]-55); |
||
//недопустимый символ |
|
||
{err =1; |
break; |
|
|
} |
//вес следующего разряда |
||
v *=16; |
|||
} |
|
|
|
if (!err) |
|
<< " |
--> " << dec << endl; |
cout << "16: --> 10: \n" << st |
|||
else |
|
NOT 16-number" << endl; |
|
cout << "string :” << st <<” |
|||
_getch(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
Перевод десятичного числа в двоичное
(строка с переведенным числом заполняется с начала, но число получается «перевернутым», затем – порядок символов в строке изменяется на обратный)
int main () {char str[81];
int number, r, i=0;
cout<<" number (10 c/c):"<<endl; cin>>number;
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
30 |
|