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

Объясните пожалуйста, как работает код. Указатели - C++

Восстановить пароль Регистрация
 
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
07.02.2013, 22:05     Объясните пожалуйста, как работает код. Указатели #1
Если не сложно, напишите пожалуйста комметнтарии к каждой строке. Никак не могу разобраться. Программа разделяет строку на слова.
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
31
32
33
34
#include "stdafx.h"
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{ setlocale (0,"rus");
  char str[80];
  char token[80];
  char *p, *q;
 
  cout << "Введите строку: ";
  gets_s(str);
 
  cout << "По словам: \n";
  p = str; 
 
 
  while(*p) { 
    q = token;  
   
    while(*p!=' ' && *p) {
      *q = *p;   
       q++; p++; 
    }
    if(*p) p++; 
    *q = '\0'; 
    cout << token << '\n';
  }
 
  system ("pause");
  return 0;
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
07.02.2013, 22:42     Объясните пожалуйста, как работает код. Указатели #2
C++
1
#include "stdafx.h"
Visual C++ что ли?

C++
1
2
3
 char str[80];
  char token[80];
  char *p, *q;
автору С вспомнился... есть ещё inline вставки в ассемблере, рекомендую...

C++
1
gets_s(str);
ещё лучше

system ("pause");
нет в unix такой команды(

это что за книга такая? где так учат?
разделять текст по словам в С++ приблизительно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vector<string> split(const string& str)
{
    typedef string::const_iterator iter;
    vector<string> ret;
 
    iter i = str.begin();
    while (i != str.end()) {
 
        // пропускаем пробелы (или символы подобные ему)
        i = find_if(i, str.end(), not_space);
 
        // находим следующий пробел после этого слова
        iter j = find_if(i, str.end(), space);
 
        // добавляем слово в выходной контейнер слов
        if (i != str.end())
            ret.push_back(string(i, j));
        i = j;
    }
    return ret;
}
Winhttp
59 / 59 / 0
Регистрация: 05.01.2013
Сообщений: 235
07.02.2013, 22:48     Объясните пожалуйста, как работает код. Указатели #3
C++
1
char *p, *q;
а я слышал, что нельзя обьявлять вот так указатели без инициализации. или можно?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
07.02.2013, 22:54     Объясните пожалуйста, как работает код. Указатели #4
Цитата Сообщение от Winhttp Посмотреть сообщение
а я слышал, что нельзя обьявлять вот так указатели без инициализации. или можно?
можно, они просто будут указывать в неизвестность (точнее там будет хлам оперативки записан вместо адреса)
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
07.02.2013, 22:55  [ТС]     Объясните пожалуйста, как работает код. Указатели #5
abit,
Книга Герберт Шилдт "С++ базовый курс". Спасибо за ответ, но цель у меня не является решить задачу. Я хочу разобрать использование указателей.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
07.02.2013, 23:35     Объясните пожалуйста, как работает код. Указатели #6
Цитата Сообщение от delexa Посмотреть сообщение
abit,
Книга Герберт Шилдт "С++ базовый курс". Спасибо за ответ, но цель у меня не является решить задачу. Я хочу разобрать использование указателей.
ну я думаю, что указатели это не та тема, с которой надо начинать, но ладно, раз так необходимо, я понимаю... я в своё время крутил record в pascal до посинения, не понимая многого...

я тогда откину ненужные конструкции, оставлю одни операции с указателями:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  char *p, *q;        // объявляются два указателя в неизвестность
 
  p = str;             // первый из них (p) указывается на str ( str тоже указатель, только константный, т.к. указывает
                         // на одну и ту же область памяти - где храниться строка, с этого момента p есть синоним str
                         // т.е. символ p[1] соответствует str[1]
 
 
  while(*p) {       // тут делается цикл, до тех пор пока содержимое по адресу этого указателя не вернёт \0
                       //  а любая ASCIIZ строка заканчивается символом \0
    q = token;     // по аналогии закидываем в q константый указатель token
   
    while(*p!=' ' && *p) { // новый цикл... пока не дошли до пробела либо до конца строки   
      *q = *p;                 // переместим символ по адресу q в адрес p
       q++; p++;            // прибавим оба адреса, но вообще всю эту конструкцию можно заменить
                                  // на *q++ = *p++;
    }
    if(*p) p++;              // если не встретился конец строки - прибавим указатель
    *q = '\0';                // а в q кинем конец строки, т.к. слово закончено
    cout << token << '\n'; // отправим готовое слово в выходной поток, переведём каретку
  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 13:15     Объясните пожалуйста, как работает код. Указатели
Еще ссылки по теме:

Объясните, пожалуйста, как работает передача переменных при вызове функций? C++
C++ Объясните, пожалуйста, зачем в C++ нужны указатели
C++ Объясните как работает код (pacman)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
delexa
2 / 2 / 1
Регистрация: 02.03.2011
Сообщений: 134
08.02.2013, 13:15  [ТС]     Объясните пожалуйста, как работает код. Указатели #7
abit, Спасибо, разобрался
Yandex
Объявления
08.02.2013, 13:15     Объясните пожалуйста, как работает код. Указатели
Ответ Создать тему
Опции темы

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