Форум программистов, компьютерный форум CyberForum.ru

Программа с лексемами через указатели - C++

Восстановить пароль Регистрация
 
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 21:02     Программа с лексемами через указатели #1
Вопросы в комментариях к коду. Не понятка в 2-х местах кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char str[80];
    char token[80];
    char *p, *q;
 
    cout << "Enter any sentance: \n";
    gets(str); // ввожу к примеру "купить машину"
 
    p = str;
 
    while(*p) {
        q = token;
 
        while(*p!=' ' && *p) {
            *q = *p;
            q++; p++;
        }
        if(*p) p++;// зачем нам p++ когда это уже и так конец строки?
        *q = '\0'; // не понятно зачем это присваивание, когда у нас *q уже будет содержать слово "купить"?
        cout << token << '\n';
    }
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
29.09.2012, 21:15     Программа с лексемами через указатели #2
веселая программка, никогда бы не подумала, что это будет работать)
1. Когда происходит выход из цикла , например когда закончилось слово,
C++
1
while(*p!=' ' && *p)
в p будет содержатся пробел, чтобы перейти на следующий символ пишется
C++
1
if(*p) p++;
2. *q = '\0'; любая строка должна в конце содержать '\0' для обозначения ее конца
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2012, 21:43     Программа с лексемами через указатели #3
Выход из внутреннего цикла будет или по пробелу, или по концу строки. Если по пробелу (не конец строки), то p++ (переход к следующему слову). Для того чтобы нормально сработало: cout << token << '\n'; в конце слова в token должен стоять '\0', иначе cout << будет выводить содержимое памяти, пока не встретит 0. В результате, после вывода слова, будет выведен и всякий мусор. Закоментируйте строку: *q = '\0'; и посмотрите на результат.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 22:33  [ТС]     Программа с лексемами через указатели #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Выход из внутреннего цикла будет или по пробелу, или по концу строки. Если по пробелу (не конец строки), то p++ (переход к следующему слову). Для того чтобы нормально сработало: cout << token << '\n'; в конце слова в token должен стоять '\0', иначе cout << будет выводить содержимое памяти, пока не встретит 0. В результате, после вывода слова, будет выведен и всякий мусор. Закоментируйте строку: *q = '\0'; и посмотрите на результат.
Немного не понятно на счёт того, что в конце слова в token должен стоять '\0'. Если идти по коду, то когда мы присваиваем *q=*p у нас потом посимвольно записываются все символы в token. Вот мы записали (к примеру у нас было "купить машину", у нас в *q записалось "купить" и соответственно в token записалось "купить". Ниже же когда мы делаем так *q = '\0'; мне становится не понятно как вообще этот знак помещается в конце слова в token, это ведь массив, он что ли помещаетс в последний индекс массива?)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2012, 23:17     Программа с лексемами через указатели #5
Цитата Сообщение от aleksand Посмотреть сообщение
token, это ведь массив, он что ли помещаетс в последний индекс массива?)
Да. Только не в последний индекс, а после последнего помещённого туда символа, т.е. после 'ь'. В token будет: купить'\0'. Помещается он туда так же, как и символы слова во внутреннем цикле while(). Вначале, указателю p присваивается адресс начала массива str: p = str;, а указателю q присваивается адресс начала массива token: q = token; После этого p указывает на начало str (на str[0]), а q указывает на начало token (на token[0]). Потом в цикле делается: *q = *p;, т.е. token[0] присваивается значение str[0]. После этого значения указателей увеличиваются: q++; p++; Теперь q указывает на token[1], а p указывает на str[1], и т.д. После помещения в token 'ь' (в token[5]) и q++; p++, q будет указывать на token[6], а p - на пробел, поэтому произойдёт выход из внутреннего цикла и в token[6] запишется '\0'(*q = '\0').
Yandex
Объявления
29.09.2012, 23:17     Программа с лексемами через указатели
Ответ Создать тему
Опции темы

Текущее время: 08:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru