- •Рядки, дії з рядками
- •Рядки
- •Рядки
- •Рядки
- •Рядки
- •Рядки
- •Рядки
- •Рядки.
- •Рядки
- •Рядки і вказівники
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки. Введення-виведення рядків
- •Строки
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
- •Рядки.
Рядки. |
|
|
|
|
|
|
|
|
|
|
|
Операції з рядками |
|
в стилі С |
|
|
|||
Введення-виведення рядків |
|
|
|
|
|||||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
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 – кількість символів рядка, яке необхідно ввести |
||
|
||
|
|
Рядки. |
|
|
|
|
|
|
|
|
|
|
Операції з рядками |
|
|
|
|
|
|
||||
|
|
в стилі С++ |
|
|
|
|||||
Введення-виведення рядків |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|||
|
// введення рядка з декількох слів з використанням методу 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++;
}
Строки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
копіювання рядків «вручну» |
|
|
|
|
|
||||
|
//копирование строки |
|
|
|
|
|
|
||||
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||
|
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*, 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 |
||||
|
} |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|