Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
30.05.2020
Размер:
428.13 Кб
Скачать

Пример_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

 

#include <string.h> void rev_str (char *s);

Реверс строки (перегрузка функций)

//прототип функции реверса строки 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

 

Соседние файлы в папке Лабораторні роботи