1

Тема: Поясніть код, будь-ласка

От в одній книзі є така програма. Що вона робить, мені зрозуміло - ви маєте ввести речення, потім воно вивиде його по словах. але незрозуміло як саме вона це робить.Ось код:

#include <stdio.h>
#include <conio.h>

int main()
{
    char sent[140];
    char *pw=sent,*ps=sent;
    puts("\n\tsentence:");
    gets(sent);
    puts("\n Words:");
    while(*ps!='\0')
        if(*ps!=' ')
        ps++;
        else {
            *ps='\0';
            puts(pw);
            pw=++ps;
        }
        puts(pw);
    getch();
    return 0;

От як вона це робить??? Розкажу те, що я зрозумів. Доки вказівник *ps не вказує на кінець рядку, то
тоді, якщо вказівник не дорівнює пробілу, то переходимо на наступний символ, або ж... І от тут не знаю. Воно ніби виводить pw. Але ж pw ми присвоїли речення ціле, ну тобто вказівник і потім ніяк його не міняли. То чому ж воно виводить тільки одне слово. Поясніть хтось по-людськи, будь-ласка.

2

Re: Поясніть код, будь-ласка

Цикл у такий хитрий спосіб замінює пробіли на термінатори (символи кінця рядку).
Наведіть скріншот виконання програми.

I belong to the Dead Generation.
Подякували: Johny_Hacker1

3

Re: Поясніть код, будь-ласка

В C використовуються рядки, що закінчуються на 0 - тобто довжина рядка визначається символом з кодом 0 ('\0'), який стоїть наприкінці рядка. Ця програма замінює пробіли на ці символи і виводить окремі рядки, що містять слова.
Ну і

Johny_Hacker написав:

Але ж pw ми присвоїли речення ціле, ну тобто вказівник і потім ніяк його не міняли.

неправда, причому неправда аж двічі: по-перше, ми змінюємо pw:

pw=++ps;

а по-друге, ми змінюємо вміст масиву sent, на який вказує pw:

*ps='\0';
Подякували: Johny_Hacker1

4 Востаннє редагувалося Johny_Hacker (09.11.2013 13:24:41)

Re: Поясніть код, будь-ласка

koala написав:

а по-друге, ми змінюємо вміст масиву sent, на який вказує pw:

*ps='\0';

Виходить ми символ пробілу замінюємо знаком, що означає кінець рядка. Отже, sent зміниться так, що в ньому замість пробілів з'являться знаки '\0', але саме речення буде залишатись в ньому? Тобто sent буде містити таке: "Hello\0beautiful\0world\0"?

Bartash написав:

Наведіть скріншот виконання програми.

Ось скріншот

Post's attachments

cvcbbb.jpg 18.05 kb, 90 downloads since 2013-11-09 

5

Re: Поясніть код, будь-ласка

Johny_Hacker написав:

Виходить ми символ пробілу замінюємо знаком, що означає кінець рядка. Отже, sent зміниться так, що в ньому замість пробілів з'являться знаки '\0', але саме речення буде залишатись в ньому? Тобто sent буде містити таке: "Hello\0beautiful\0world\0"?

Абсолютно правильно.

Подякували: Johny_Hacker1

6

Re: Поясніть код, будь-ласка

Johny_Hacker написав:

Виходить ми символ пробілу замінюємо знаком, що означає кінець рядка. Отже, sent зміниться так, що в ньому замість пробілів з'являться знаки '\0', але саме речення буде залишатись в ньому? Тобто sent буде містити таке: "Hello\0beautiful\0world\0"?

Вірно думаєте.
Для підтвердження додайте в кінці програми

puts(sent);

і побачите лише одне - перше - слово, бо puts() працює до термінатора.

I belong to the Dead Generation.
Подякували: Johny_Hacker1

7

Re: Поясніть код, будь-ласка

Нарешті зрозумів. Дуже дякую за допомогу!