15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
1

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

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

Author24 — интернет-сервис помощи студентам
Не представляю что это может быть. (строка 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;
 
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2013, 00:04
Ответы с готовыми решениями:

Правильность записи цикла фор
Есть задание: вычислить сумму s, прекращая суммирование, когда очередной член суммы по абсолютной...

почему все что после цикла фор не работает?
function load(){ if (document.choiceForm.zerkalo.checked){ alert('мы тут'); var textarr = new...

Написать программу при операторе цикла фор для распечатки на экране монитора указанного в варианте набора символ
Написать программу оператора цикла фор для рас-печатки на экране монитора указанного в варианте...

Установил компонент, вижу интерфейс, не вижу самого компонента
Rad Studio XE5. Зарегистрировал dll Собрал tlb Импортировал компонент из длл Размещаю...

3
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
24.09.2013, 00:07 2
Возможно так? Хотя не уверен..
C++
1
cout << "p1: " << *p1 << endl;
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
24.09.2013, 00:07 3
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
strlen Возвращает длину строки с завершающим нулевым символом
Нет, strlen возвращает длину строки без учета завершающего нулевого символа.
1
15 / 15 / 2
Регистрация: 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;
0
24.09.2013, 17:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2013, 17:08
Помогаю со студенческими работами здесь

на windows 7 не вижу интернета но вижу сеть
Здраствуйте начну пожалуй по порядку. На протяжении долгох лет пользовался ХР, захотелось чего то...

Вывод сообщения за 10 последних итераций цикла
Добрый день всем! Имеется код, который в таймере выключает/ребутит компьютер (все работает):...

Запуск второго цикла сообщения в единичном потоке является недопустимой операцией
Ошибка: &quot;Запуск второго цикла сообщения в единичном потоке является недопустимой операцией. Вместо...

Написать программу, которая с помощью цикла FOR /D ищет в log-файлах Windows сообщения...
Написать программу, которая с помощью цикла FOR /D ищет в log-файлах Windows сообщения, задаваемые...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru