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

Не вижу сообщения из цикла фор - C++

Восстановить пароль Регистрация
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
24.09.2013, 00:04     Не вижу сообщения из цикла фор #1
Не представляю что это может быть. (строка 83) cout << "p1: " << p1 << endl; cout << "i: " << i << endl;

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
//Листинг 8.11. Выделение слов из массива символов
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
 
 #include <ctype.h>
 
 #include <string.h>
 
 bool GetWord(char* string, char* word, int& wordOffset);
 
 // основная программа
 
 int main()
 
 {   char*  sprobuem;
 
     const int bufferSize = 255;
 
     char buffer[bufferSize+1]; // переменная для хранения всей строки
 
     char word[bufferSize+1]; // переменная для хранения слова
 
     int wordOffset = 0; // начинаем с первого символа
 
     cout << "Enter а string: ";
 
     cin.getline(buffer,bufferSize);
 
     sprobuem=buffer; cout << "sprobuem: " << sprobuem << endl;
 
  while (GetWord(buffer,word,wordOffset))
 
   {
    cout << "Got this word: " << word << endl;
   }
 
 
 
  system("pause  ");return(0);
 
 }
 
 
 
 // Функция для выделения слова из строки символов.
 
 bool GetWord(char* string, char* word, int& wordOffset)
 
 {
 
     cout << "string: " << string << endl;
     cout << "word: " << word << endl;
     cout << "wordOffset: " << wordOffset << endl;
     cout << "string[wordOffset]: " << string[wordOffset] << endl;
 
    if (!string[wordOffset]) // определяет конец строки?
 
      return false;
 
 
 
    char *p1, *p2;
 
    p1 = p2 = string+wordOffset; // указатель на следующее слово
     cout << "p1: " << p1 << endl;
       cout << "p2: " << p2 << endl;
 
 
 
    // удаляем ведущие пробелы
       cout << "strlen(p1): " << strlen(p1) << endl;  cout << "isalnum(p1[0]): " << isalnum(p1[0]) << endl;
 
    for (int i = 0; i<(int)strlen(p1) && !isalnum(p1[0]); i++){// strlen Возвращает длину строки с завершающим нулевым символом
 
      p1++; //Функция isalnum() возвращает ненулевое значение, если ее аргумент ch является либо буквой, либо цифрой. 
      cout << "p1: " << p1 << endl; cout << "i: " << i << endl;}
 
 
    // проверка наличия слова
 
   // if (!iKalruj[n(pl[0]))
 
   //   return false;
 
 
 
    // указатель р1 показание начало сдолующего слова
 
    // iа к жо как и p2
 
    p2 = p1;
 
 
 
    // перпмещавм p2 и конец олова
 
    while (isalnum(p2[0]))
 
      p2++;
 
 
 
    // p2 указывает на конец слова
 
    // а p1 - в начало
 
    // разность указатолой показываот длину слова
 
    int len = int (p2 - p1);
 
 
 
    // копируем слово в буфер
 
    strncpy (word,p1,len);  // Функция strncpy() копирует до count символов из строки, адресуемой параметром str2, в массив, адресуемый параметром str1. Параметр str2 должен указывать на строку с завершающим нулевым символом.
 
 
 
 
 
    // и добавляем символ разрыва сроки
 
    word[len]='\0';
 
 
 
    // ищем начало следующего слова
 
    for (int i = int(p2-string); i<(int)strlen(string) && !isalnum(p2[0]); i++) // strlen Возвращает длину строки с завершающим нулевым символом
 
      p2++;   //Функция isalnum() возвращает ненулевое значение, если ее аргумент ch является либо буквой, либо цифрой. 
 
 
 
    wordOffset = int(p2-string);
 
 
 
    return true;
 
 }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
24.09.2013, 00:07     Не вижу сообщения из цикла фор #2
Возможно так? Хотя не уверен..
C++
1
cout << "p1: " << *p1 << endl;
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.09.2013, 00:07     Не вижу сообщения из цикла фор #3
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
strlen Возвращает длину строки с завершающим нулевым символом
Нет, strlen возвращает длину строки без учета завершающего нулевого символа.
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
24.09.2013, 17:08  [ТС]     Не вижу сообщения из цикла фор #4
Спасибо. Не знаю, что strlen Возвращает я скопировал себе из справки, не понял все же что касается завершающего нулевого символа. А по результатам я точно вижу, что число сответствует длине строки.

cout << "p1: " << p1 << endl; Я использую так, так-как, эти пе, обьявленные с указателем, дальше у автора используются просто так, просто как пе первое и второе, и я их так поэтому и вывожу.

Цикл работает, пока в начале строки пробелы.Вроде понял. p1 и 2 выводит в цикле введенную строку, между прочим.

Также cout << "string: " << string << endl; выводит строку, а cout << "wordOffset: " << wordOffset << endl;выводит три строки хаотичных символов, заканчивающиеся веденой строкой.

Добавлено через 5 минут
Таки да, этот цикл каким-то образом удаляет пробел, если он в начале строки!! Вот это да!!!!

Добавлено через 55 минут
Поразительно!!!!!! Эти пе один и два все показывали из себя введенную мной строку или ее часть, но при их взаимном вычитании выходит число!!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 while (isalnum(p2[0]))
 
    {   p2++;    cout << "p2++: " << p2 << endl; }
 
 
 
    // p2 указывает на конец слова
 
    // а p1 - в начало
 
    // разность указатолой показываот длину слова
 
    int len = int (p2 - p1);     cout << "len: " << len << endl;   cout << "p2 - p1: " << p2 - p1 << endl;
Yandex
Объявления
24.09.2013, 17:08     Не вижу сообщения из цикла фор
Ответ Создать тему
Опции темы

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