Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2013, 16:06   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию Помогите разобрать программу с указателями и массивами

Программа

В строках 26, 28 мы создаем массивы?

С помощю getline мы вводим строку. И о чудо! я вижу, что теперь в массиве не 225 символов, а столько, сколько
я вводил.

bool GetWord(char* string, char* word, int& wordOffset) указатели на массив? int& нну забыл, и не сображу, это что?

cout << "string[wordOffset]: " << string[wordOffset] << endl; ( стр.63 ) выводит 284 символа, причем сначала 4 строки бог знает каких символов и тут же без перехода введённую строку.

char *p1, *p2; (стр.71) самая непонятка!!!!! Это же указатель. Вот мы ег обьявили

p1 = p2 = string+wordOffset; Что же в нем хранится? Указатель? почему при прямом выводе выводится не адрес, а строка? Я ожидал, что так буде вывиден cout << "p1: " << p1 << endl;адрес, а так cout << "*p1: " <<*p1 << endl;
строка, однако строка выводится прямо!!

Мало того, при операции p1++; из строки сначала вычитается по символу на каждый шаг!! Как это???? Офигеть!!

Код:
//Листинг 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++;    cout << "p2++: " << p2 << endl; }
 
 
 
    // p2 указывает на конец слова
 
    // а p1 - в начало
 
    // разность указатолой показываот длину слова
 
    int len = int (p2 - p1);     cout << "len: " << len << endl;   cout << "p2 - p1: " << p2 - p1 << endl; 
 
 
 
    // копируем слово в буфер
 
    strncpy (word,p1,len);  // Функция strncpy() копирует до count символов из строки, адресуемой параметром str2, в массив, адресуемый параметром str1. Параметр str2 должен указывать на строку с завершающим нулевым символом.
 
    cout << "word: " << word << endl;   cout << "strlen(word): " << strlen(word) << endl;
 
 
 
    // и добавляем символ разрыва сроки
 
    word[len]='\0';   for (int i = 0; i<=len; i++) cout << "word[i]: " << word[i] << "    [i]: " << i  <<  endl;
    cout << "word: " << word << endl;
 
 
    // ищем начало следующего слова
 
    for (int i = int(p2-string); i<(int)strlen(string) && !isalnum(p2[0]); i++) // strlen Возвращает длину строки с завершающим нулевым символом
 
      p2++;   //Функция isalnum() возвращает ненулевое значение, если ее аргумент ch является либо буквой, либо цифрой. 
 
 
 
    wordOffset = int(p2-string);
 
 
 
    return true;
 
 }
Dimka-novitsek вне форума Ответить с цитированием
Старый 25.09.2013, 18:45   #2
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Логика вопроса. Мы допустим обьявили переменную как ссылку, но поместили в нее не ссылку на массив, а массив.
Не так sprobuem=&buffer; а так sprobuem=buffer;. Положим, в ней лежит как-бы то ни было массив.

Как мы тогда с ним работаем так p1++; сдвигая пошагово? Или проще не заморачиваться а пытаться использовать, в дальнейшем?
Dimka-novitsek вне форума Ответить с цитированием
Старый 25.09.2013, 22:50   #3
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

делаем ссылку
int* ssilka;
В ней мы могём покласть то нибудь объёмом в int. по идее компилятор тебе не даст туда покласть ссылку. ну да ладно.
если допустим ты сделал char* mass массив и ссылку char* то вроде как присваивая ссылке значение являющееся адресом массива типа char* ssilka = &mass[0] || char* ssilka = mass || char* ssilka = &mass(если mass в ппоследнем примере не ссылка а сам массив) ты выполняеш одно и тоже действие - передавая адрес первого элемента массива и работаеш с ним как с массивом mass[i++||i--].
Если ты перемещаеш указатель mass++ или иначе - прийдётся обратно возвращать его через mass-- столько раз, сколько ты сделал ++.
Я сильно не заморачивался и могу ошибаться.

Если у тебя примерно такая штука char** mass получается из за ссылки в ссылке то тут работать вроде надо по хитрожопому, ето чисто предположение, я перебором искал и точно не помню как правильно, типа так: *mass[i];
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 26.09.2013, 00:28   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Что?
Код:
делаем ссылку 
int* ssilka;
Это не ссылка. Между ссылкой и указателем существуют ключевые отличия.

P.S - сообщение Ваше - набор каких-то бессвязных, запутанных предложений. Вряд ли автор его читать будет
Igor95 вне форума Ответить с цитированием
Старый 26.09.2013, 01:07   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Что?
Код:
делаем ссылку 
int* ssilka;
Это не ссылка. Между ссылкой и указателем существуют ключевые отличия.

P.S - сообщение Ваше - набор каких-то бессвязных, запутанных предложений. Вряд ли автор его читать будет

Так в чём проблема, напиши свой вариант ответа.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 26.09.2013, 11:31   #6
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Цитата:
Если у тебя примерно такая штука char** mass получается из за ссылки в ссылке то тут работать вроде надо по хитрожопому, ето чисто предположение, я перебором искал и точно не помню как правильно, типа так: *mass[i];
Это круто! Вместо того чтобы почитать спецификацию языка искать как эта чертовщина работает перебором. Так нужно делать всем ящитаю
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 26.09.2013, 13:08   #7
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Это круто! Вместо того чтобы почитать спецификацию языка искать как эта чертовщина работает перебором. Так нужно делать всем ящитаю
Я тя от всей души бешано поздравляю, а теперь цитируй из спецификации где это описывается чтобы оправдать свои слова перед вопрошавшим.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 26.09.2013, 13:18   #8
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Пажалста
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобрать программу c++ v6.0 thedarklord Общие вопросы C/C++ 2 16.04.2013 15:33
разобрать программу patrik14 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.12.2012 05:08
“Иследование работы с указателями и массивами ” saammy Общие вопросы C/C++ 1 13.12.2010 22:38
работы с указателями и массивами... Катюшенька Помощь студентам 21 24.01.2009 12:17
Разобрать программу DarkDeivel Общие вопросы Delphi 13 21.09.2008 14:17