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

Рядки.

 

 

 

 

 

 

 

 

 

 

Операції з рядками

 

в стилі С

 

 

Введення-виведення рядків

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main ()

 

 

 

 

 

 

 

 

 

{ const int n = 40;

 

 

 

 

 

 

 

 

 

char str[n];

 

 

 

 

 

 

 

 

 

printf (" string?\n");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

scanf ("%s", str);

 

//odin_dwa

 

 

 

 

 

 

printf (" %s\n", str);

 

//odin_dwa

 

 

 

 

 

 

printf (" %3s\n", str);

//3 – мінімальний розмір поля виводу: odin_dwa

 

printf (" %10.2s\n", str);

 

//od

вирівнювання вправо і 2 символа

 

printf (" %-10.2s\n", str);

 

//od

вирівнювання вліво і 2 символа

 

printf (" string?\n");

 

 

 

 

 

 

 

 

 

scanf ("%s", str);

 

//odin

dwa введення до пробілу

 

printf (" %s\n", str);

 

//odin

 

 

 

 

 

 

fflush (stdin); // для коректного виклику scanf () потрібно очистити буфера введення

printf (" string?\n");

 

 

gets(str);

//odin

dwa

puts(str);

//odin

dwa

_getch();

 

 

return 0;

 

 

}

Функція scanf () виконує введення рядка До першого пробільного символа (З декількох слів введеться тільки перше). Функція gets () вводить з пробілами.

11

 

 

 

 

 

 

 

 

 

Рядки.

 

Перетворення значення базового типу в С-рядок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введення-виведення рядків

 

 

 

Функція sprintf () аналогічна printf (),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

char buf [20];

 

 

проте виводить дані в рядок-буфер.

 

 

 

int i=22222;

 

 

 

 

 

 

 

 

 

 

 

 

 

sprintf_s(buf, "%7d", i);

// вивід змінної i типу int в рядок-буфер buf,

 

cout << buf<< endl;

 

// довжина якої дорівнює 7: ” 22222”

 

sprintf_s(buf, "%5d", i);

//вывод переменной i типа int в строку-буфер buf,

 

cout << buf<< endl;

 

// довжина якої дорівнює 5: ”22222”

 

char c='a';

 

 

 

 

 

 

 

sprintf_s(buf, "%7c", c);

//вивід змінної c типу char в рядок-буфер buf,

 

cout << buf<< endl;

 

// довжина якої дорівнює 7: ” a”

 

sprintf_s(buf, "%c", c);

// вивід змінної c типу char в рядок-буфер buf,

 

cout << buf<< endl;

 

// довжина якої дорівнює 1: ”a”

 

double d=1.23;

 

 

 

 

 

 

 

sprintf_s(buf, "%5f", d);

// вивід змінної d типу double, довжина якої

 

cout << buf<< endl;

 

// дорівнює 8: ”1.230000”, в рядок-буфер buf

 

sprintf_s(buf, "%9f", d);

// вывод переменной d типа double (длина 8) в строку-буфер

 

cout << buf<< endl;

 

// buf довжини 9:” 1.230000”

 

sprintf_s(buf, "%11f", d);

// вивід змінної d типу double в рядок-буфер buf

 

cout << buf<< endl;

 

// довжини 11: ” 1.230000”

 

 

 

 

 

 

 

 

 

 

Рядки.

 

 

 

 

 

 

 

 

 

 

Операції з рядками

 

 

 

 

Введення-виведення рядків

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в стилі С

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{//посимвольного введення-виведення

 

{//посимвольного введення рядка

 

 

 

 

 

 

 

 

рядка

 

 

 

 

 

const int MAX = 10;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int i=0;

 

 

 

 

 

char str [MAX];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf (“\nEnter a string: ");

 

 

 

printf (“\nEnter a string: ");

 

 

 

 

 

 

 

for (int i=0; i<MAX-1; i++)

 

 

 

 

while ( (str[i] = _getch() ) !=13 )

// або != ‘\r’

 

scanf ("%c", &str[i]); //123456789

 

 

 

 

 

 

 

_putch (str[i++]);

// вивід

 

str[MAX-1]='\0';

 

 

 

 

 

 

 

str[i] = '\0';

// завершення рядка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf (“\n%s", str);

//123456789

 

 

 

 

_putch ('\n'); _putch ('o'); _putch ('k');

 

_getch();

 

 

 

 

 

 

 

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printfв стилі С++

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//}введення рядка до пробільного символа

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

{// посимвольного введення рядка

 

 

 

 

 

 

 

 

 

 

 

const int MAX = 10;

 

 

 

{ const int MAX = 80;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

char str[MAX];

 

 

 

 

 

char str[MAX];

 

// рядок-масив

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cout << "Enter a string: ";

 

 

 

cout << "Enter a string: ";

 

 

 

 

 

for (int i=0; i< MAX-1; i++)

 

 

 

 

 

 

 

 

 

 

 

cin >> str[i];

 

 

cin >> str;

// введення рядка

 

 

 

 

 

str[MAX-1]='\0';

 

 

 

 

 

cout << "You entered: " << str << endl;

 

 

 

 

 

cout << "You entered: " << str << endl;

 

 

_getch();

 

 

 

 

 

 

 

 

 

_getch();

 

 

 

 

 

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

введення виконується до пробільного символа

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рядки.

Операції з рядками в стилі С++

Введення-виведення рядків

При переміщенні рядка в потік cin пробіли і символи нового рядка конвертуються в завершальний нульовий байт

Для введення будь-яких символів, включаючи пробільні,

використовуються методи get () і get (c) класу istream, об'єктом якого є cin:

// посимвольного

введення рядка з використанням методу get()

int main()

 

 

 

{const int MAX

= 10;

 

char str[MAX];

 

// рядок-масив

 

cout << "Enter a

string: ";

 

for (int i=0;

i<

MAX-1; i++)

 

 

 

cin.get(str[i]);

//введення символів 12345 9

str[MAX-1]='\0';

cout << " string : " << str << endl; //вивід рядка 12345 9

_getch(); return 0;

}

cin >> setw (MAX) >> str; // введення не більше MAX-1 символів рядка // якщо більше, то вони не будуть вставлені

 

14

scanf (“%ks”, name); //k – кількість символів рядка, яке необхідно ввести

 

 

 

Enter a string: qwert
12345
qwert$
You entered: qwert
12345 qwert

Рядки.

 

 

 

 

 

 

 

 

 

Операції з рядками

 

 

 

 

 

 

 

 

в стилі С++

 

 

 

Введення-виведення рядків

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// введення рядка з декількох слів з використанням методу getline()

 

 

 

int main()

 

 

 

 

 

 

 

 

 

 

 

 

Для введення рядка з декількох

слів

 

{

 

 

 

 

const int MAX = 80;

 

 

використовуються методи getline

() або

 

 

char str[MAX];

 

 

get () об'єкта cin

 

 

 

 

 

cout << "\nEnter a string: ";

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cin.getline (str, MAX);

// введення рядка в str

 

//символ \nзчитується (видаляється) з потоку вводу

 

// і замість нього в строкову змінну записується '\ 0'

 

cout << "You entered: " << str << endl;

 

 

 

 

 

cin.get (str, MAX);

 

// введення рядка в str

//символ '\ n' залишається в потоці

//в строкову змінну додається '\ 0'

cout << "You entered: " << str << endl; _getch();

return 0;

}

// введення кількох рядків, що завершуються <enter>, як одного рядка const int MAX = 2000;

char str[MAX]; int main()

{

cout << "\nEnter a string:\n";

cin.get(str, MAX, '$'); //введення рядків завершується символом cout << "You entered:\n" << str << endl;

_getch(); return 0;

}

Рядки.

Операції з рядками

 

Введення-виведення рядків

в стилі С++

Метод get() при вызове с двумя аргументами два раза подряд работает хорошо, при условии :

 

char s[10];

 

 

 

 

 

 

 

 

 

 

int n=5;

 

 

 

 

 

 

 

 

 

 

cin.get (s, n);

//1

 

 

 

 

 

 

 

 

 

Результат роботи :

 

 

cout << s << endl;

//2

 

 

 

cin.get ();

 

 

123

 

 

 

 

 

 

 

 

Результат работи без cin.get():

 

 

 

cin.get (s, n);

//3

 

123

 

 

 

cout << s << endl;

//4

 

234

123

 

 

 

 

 

 

 

123

Ще краще - використовувати в

 

 

 

 

cin.get ();

 

 

234

 

 

 

 

 

 

 

таких випадках метод getline().

 

 

 

 

cin.get (s, n);

//5

 

345

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cout << s << endl;

//6

 

345

end

 

 

 

cout << "end" << endl; //7

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введення декількох рядків:

 

 

 

 

 

 

 

 

int main()

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

const int n = 80;

 

 

 

 

 

 

 

 

 

 

char s[n];

 

 

 

 

 

 

 

 

 

 

while (cin.getline(s, n)) {

 

// введення рядка s,

 

cout << s << endl;

 

// вивід рядка

 

//……….

 

обробка рядка

}

_getch(); вихід з циклу – ctrl+z – ознака кінця файлу 16 return 0;

}

Рядки.

 

Операції з рядками

Введення-виведення рядків

 

 

char h[ ] =”Press any key!”;

 

посимвольного вивід рядка

char *hd =”Press any key!”; //размер=14+1

 

 

for (int i=0; i<15; i++) putchar (*(h+i));

//OK! ( h[i])

putchar (‘\n’);

 

 

for (int i=0; i<15; i++) putchar (*(hd+i));

// OK! (hd[i])

putchar (‘\n’);

 

 

while (*hd !=’\0’) putchar (*hd++); // OK!, вказівник-змінна putchar (‘\n’);

//while (*h !=’\0’) putchar (*h++); // неправильно! константних вказівник putchar (‘\n’);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

введення обмеженого

числа символів рядка

 

 

 

 

{const int MAX = 6;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

char str [MAX];

 

 

 

 

 

 

 

 

 

 

 

 

cout << "Enter a string: ";

 

 

 

 

 

 

 

 

 

 

 

cin >> setw (MAX) >> str;

//odin_dwa

 

 

 

 

 

 

 

 

 

 

 

cout << str << endl;

//odin_

 

 

 

 

 

 

 

 

 

 

 

return 0;

o

d

 

i

n

_

\0

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

6

7

8

9

 

 

str

 

 

 

 

 

 

 

 

 

 

 

неконстантный указатель на неконстантные данные
//вызов функции вывода строки
//функция вывода строки

Рядки. Введення-виведення рядків

функція виведення рядка Операції з рядками

void dispstr (char*);

int main()

// str константный указатель на неконстантные данные

{

char str[] = "Idle people have the least leisure."; // или

// char *str = "Idle people have the least leisure.";

dispstr(str);

//вызов функции вывода строки

_getch(); return 0;

}

void dispstr(char* ps) //функция вывода строки

{while( *ps ) // ps неконстантный указатель на неконстантные данные

cout << *ps++;

 

}

 

int main()

 

{

// str константный указатель на неконстантные данные

//char str[] = "Idle people have the least leisure."; char *str = "Idle people have the least leisure.";

dispstr(str);

_getch(); return 0;

}

void dispstr(char* ps)

{ ps[0]='i'; //но!!!? Ошибка выполнения, хотя while( *ps ) //ps

cout << *ps++;

}

{cout << "string : " << endl; cout << st << endl;
}
#include <cstring> //for strlen() void vvodstr(char* st, int n)
{cout << "string? " << endl; cin.getline(st, n);
}
void vyvodstr(char* st)

Строки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

копіювання рядків «вручну»

 

 

 

 

 

 

//копирование строки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void vvodstr (char*, const int); // введення рядка

 

 

 

 

 

 

void vyvodstr (char*);

 

// вивід рядка

 

 

 

 

 

 

 

void copystr (char*, const char*); // копіювання рядка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int main()

 

void copystr(char* dest, const char* src)

 

 

 

{const int MAX=80;

{

 

 

 

 

 

 

 

 

 

char str1[MAX];

while( *src )

//доки ні 0-символ

 

 

 

char str2[MAX];

 

*dest++ = *src++; // копіювати символ

 

 

 

vvodstr

(str1, MAX);

*dest = '\0';

// завершити рядок 0-символом

 

vyvodstr

(str1);

 

}

 

 

 

 

 

 

 

 

 

copystr(str2, str1);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

unsigned j;

или

 

 

cout << "new ";

 

 

 

 

 

 

for(j=0; j < strlen(str1); j++)

 

 

vyvodstr

(str2);

 

 

 

 

 

 

 

 

str2[j] = str1[j];

 

 

_getch();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return 0;

 

 

 

str2[j] = '\0';

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

або, як і у випадку з масивами : !!!

#include <сstring> char s[9];

char hello[] = "motor";

memcpy (s, hello, sizeof (hello)); //копіювання області пам'яті зазначеного розміру

cout<< s<< endl; // motor

void scpy (char s[], char t[])
{
int i=0;
while ((s[i] = t[i]) !='\0') i++;
}

Рядки.

Можливості Сі + + по «оптимізації» тексту програми

void scpy (char*, char*); int main()

{

char* str1 = " Press any key!"; char str2[80];

scpy (str2, str1); //copy str1 to str2 cout << str2 << endl; //display str2

_getch(); return 0;

}

 

 

 

 

 

 

 

 

void scpy (char *s, char *t)

 

 

 

 

 

{

 

 

 

 

 

 

 

while ((*s =*t) !='\0')

void scpy (char *s, char *t)

 

 

}

{s++; t++;}

{

 

 

 

 

 

 

while ((*s++ = *t++) !='\0');

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void scpy (char *s, char *t)

 

 

 

 

{ while (*s++ =*t++);

 

20

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Соседние файлы в предмете Объектно ориентированное программирование