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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
#1

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

24.09.2013, 00:04. Просмотров 340. Ответов 3
Метки нет (Все метки)

Не представляю что это может быть. (строка 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;
 
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 00:04     Не вижу сообщения из цикла фор
Посмотрите здесь:

Не вижу ошибку C++
Линейный алгоритм, а ошибку не вижу C++
Не вижу ошибку C++
Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла. C++
Игра Maze labirinth - не вижу начала игры C++
C++ То ли getchar мозги парит, то ли я что-то не вижу
C++ не вижу ошибки
Цикл фор C++
C++ Нахождение отрицательного цикла в графе и вывод цикла
C++ Не вижу последовательности
Выражение в скобках и без скобок. Какая разница? В цикле фор C++
Пронумеровать очерёдность каждого сообщения так, чтобы нумерация очерёдности печаталась напротив сообщения C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 293
24.09.2013, 00:07     Не вижу сообщения из цикла фор #2
Возможно так? Хотя не уверен..
C++
1
cout << "p1: " << *p1 << endl;
castaway
Эксперт С++
4870 / 3009 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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     Не вижу сообщения из цикла фор
Ответ Создать тему
Опции темы

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