Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> <string.h> пробелы 
:(
    Опции темы
Garcian
Дата 23.3.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Здравствуйте уважаемые программисты!
Дана задача: определить в заданной строке координаты подстроки, содержашей наибольшее число пробелов. Примечание: нельзя обращаться к эелементам массива через указатели (исключение *t = &D[0]).
Вот мой код:
Код

#include <iostream.h>
#include <fstream.h>
#include <string.h>
fstream f, P;

int main () {
    char D[80+1], *t = &D[0]; int N = 0; /*char S;*/ int a;
    
    f.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);
    f.unsetf (ios::skipws);    
    
    for (int i=0; i < 80; i++) { f >> D[i]; }
    
    P.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_out.txt", ios::out);
    while (1) 
    
    {
        a = strcspn (t, " "); // пропускает все символы не совпадающие с пробельными
        t += a; // t находимся у первого пробела
        a = strspn (t, " "); // присваиваем переменной самый длинный сегмент из пробелов
        if (a == 0) break;
        N += a; //t += a;
        P << N;
    } 
    //t += a;   
    f.close ();
    P.close ();   
     
}     


На лекциях все понятно объяснили, а значение функий я нашел в поисковике. Несмотря на все это программа не работает! Переменой а все время присваивается 0. Хотел бы понять, что делаю не так.

В общем чет совсем запутался с выводом координат  smile 

Это сообщение отредактировал(а) Garcian - 23.3.2009, 00:47
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
что делаю не так.

для начала обнулите буффер для чтения  char D[..] = {0}
Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
strcspn (t, " "); // пропускает все символы не совпадающие с пробельными

имхо, тут логичнее использовать функцию strchr ()

Цитата(Garcian @  22.3.2009,  23:21 Найти цитируемый пост)
        a = strspn (t, " "); // присваиваем переменной самый длинный сегмент из пробелов

перечитайте еще раз что делает функция и подправьте код.


еще добавьте строку вывода на экран буффера, после чтения в него с файла
 и опубликуйте, что получилось в результате (исправленный код + прочиитанная строка с файла).





Это сообщение отредактировал(а) mes - 23.3.2009, 10:47


--------------------
PM MAIL WWW   Вверх
AnLun
Дата 23.3.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 3.1.2008

Репутация: нет
Всего: нет



Не совсем по теме, но...
Код

char *t = &D[0];

это логичней писать так:
Код

char *t = D;


Это сообщение отредактировал(а) AnLun - 23.3.2009, 11:19
PM MAIL   Вверх
Garcian
Дата 23.3.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



В общем ошибка еще в первой половине программы...
Использую strchr

#include <iostream.h>
#include <fstream.h>
#include <string.h>
fstream f, P;

Код

int main () {
    char D[80] = {0}, *t = D;  
    
    f.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_in.txt", ios::in);
    f.unsetf (ios::skipws);    
    
    for (int i=0; i < 80; i++) { f >> D[i]; }
    
    P.open ("C:\\Documents and Settings\\Garcian\\Ìîè äîêóìåíòû\\L2_out.txt", ios::out);
    while (1) 
    
    {
        char * a, c = ' ';
        a = strchr (D, c); // Возращает указатель на местонахождение персого совпадения с символом  c в строке D
        
        if (a == NULL) { 
            cout << "Net probelov" << endl; P << "Net probelov";
            break;
        }  
        P << a;
        cout << a;
     }
}


Уже здесь выдает не пойми что  smile 

Это сообщение отредактировал(а) Garcian - 23.3.2009, 20:09
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Garcian @  23.3.2009,  19:06 Найти цитируемый пост)
Уже здесь выдает не пойми что  smile  

хватит проверять телепатические способности форумчан .

Вы видете и понять не можете, а нам не показываете , а ответа требуете smile

может у Вас файла не находит, или он пустой. 
Цитата(mes @  23.3.2009,  09:41 Найти цитируемый пост)
еще добавьте строку вывода на экран буффера, после чтения в него с файла

где ?


Это сообщение отредактировал(а) mes - 23.3.2009, 20:16


--------------------
PM MAIL WWW   Вверх
Garcian
Дата 23.3.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Простите!

Например пишу во входном файле одни пробелы - создает файл с кучей пробелов. Если поставить вначале пробелы, а потом буквы - выдает большое кол-во нулей) Если начать не с пробела, то вообще пишет, что их нет.

Цитата

ще добавьте строку вывода на экран буффера, после чтения в него с файла
 - не понял  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



после 7й строчки (for (int i=0; i < 80; i++) { f >> D[i]; }) 
поставьте 
Код

std::cout << D<<std::endl;


если вывод на экране не будет соответсвовать файлу, то значит читаете с файла неправильно.



Цитата(Garcian @  23.3.2009,  19:06 Найти цитируемый пост)
   for (int i=0; i < 80; i++) { f >> D[i]; }

Вы не проверяете файл на конец, а это значит, что если в файле меньше запрашиваемых вами 80 символов, то в результативном  буффере будет содержать мусор.


Это сообщение отредактировал(а) mes - 23.3.2009, 20:34


--------------------
PM MAIL WWW   Вверх
Garcian
  Дата 23.3.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



mes, вы правы, ошибка при чтении... ничего не понимаю, вроде даже проверку на конец строки сделал...
 
Код

 for (i = 0; *(t+i)!='\0'||'\n'; i++) { fin >> *(t+i); }
    std::cout << *(t+i) << std::endl;

пусто =\
--------------------
Неродивый студент
PM MAIL   Вверх
zim22
Дата 23.3.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Garcian,  вы сами поняли, что написали внутри цикла?
Инкрементить i до тех пор, пока значение элемента по адресу t+i не равно '\0' ИЛИ TRUE (т.к. '\n' интерпретируется не нулём, следовательно 1). И получаем бесконечный цикл. Дальше вы выводите cout уже ВНЕ цикла, а не во время каждой итерации. Сомневаюсь, что так было задумано.


--------------------
PM MAIL   Вверх
Anikmar
Дата 23.3.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



А доступ к элементу массива по индексу считается через указатель?
PM MAIL ICQ   Вверх
Garcian
Дата 23.3.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Цитата(zim22 @ 23.3.2009,  21:43)
Garcian,  вы сами поняли, что написали внутри цикла?
Инкрементить i до тех пор, пока значение элемента по адресу t+i не равно '\0' ИЛИ TRUE (т.к. '\n' интерпретируется не нулём, следовательно 1). И получаем бесконечный цикл. Дальше вы выводите cout уже ВНЕ цикла, а не во время каждой итерации. Сомневаюсь, что так было задумано.

ай ужс, ввсел вывод внутри цикла, компьютер зазвенел громко) Да я по ходу совсем запутался. Как проверить файл на конец и как прочитать строку, что не пробую все не так.
Anikmar, доо, но можно обращаться только к первому и последнему элементам.
--------------------
Неродивый студент
PM MAIL   Вверх
mes
Дата 23.3.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Garcian @  23.3.2009,  20:35 Найти цитируемый пост)
ничего не понимаю, вроде даже проверку на конец строки сделал...

Цитата(Garcian @  23.3.2009,  21:27 Найти цитируемый пост)
Да я по ходу совсем запутался. Как проверить файл на конец и как прочитать строку, что не пробую все не так.

Ну Вы бы хоть поискали, в соседние темы заглянули, 
или ждете пока все разжуют smile 

вот к примеру совсем недалеко от вашей тема называется 
"Замена пробелов String.h " - http://forum.vingrad.ru/forum/topic-251394.html
там есть и примеры работы с пробелами и чтение с файла,

к примеру в этом посту 
http://forum.vingrad.ru/index.php?showtopi...t&p=1819041
нужное Вам находится в строках 16-17 (ну вот и искать теперь не надо smile)

также прочтите замечание насчет F и P. 
smile


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 23.3.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Garcian, 
Считывайте из файла как хотите, но изврат без применния индексов и указателей предлагаю такой:
Код

void FindSpaces(void)
{
    int Len,Cur;
    char *Str1 = "   aaa     bbb  ccc   ddd    eee      uuu                  ";
    char Str2[80]={0};
    char *Pos,*MaxPos;
/*
         Итак: Str1 - Исходная строка - здесь определена статически, как вы ее получите - ваше дело.
          Str2 - служебная строка. В моем примере сделана статически 80, можете поменять
*/
    Len =  strlen(Str1);
    Cur = 1;
    MaxPos = NULL;
/*
       Основной цикл: Ищу строку из 1 пробелеа, затем из 2-х и т.п  - до длины исходной строки. Запоминаю последнюю найденую позицию.
       Если в очередной раз строки с таким кол-вом пробелов не нашел - значит баста.
*/
    while (Cur <=Len)
    {
        strncpy(Str2,Str1,Cur);
        strnset(Str2,' ',Cur);
        Pos = strstr(Str1,Str2);
        if (Pos == NULL) break;
        MaxPos = Pos;
        Cur++;
    }

    if (MaxPos == NULL) printf ("netu\n");
    else printf("%d\n",MaxPos - Str1);
}



Полный изврат, но ни указателей ни доступа к элементам строки не использовал.
PM MAIL ICQ   Вверх
Garcian
Дата 23.3.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Цитата(Garcian @ 23.3.2009,  21:35)
mes, вы правы, ошибка при чтении... ничего не понимаю, вроде даже проверку на конец строки сделал...
 
Код

 for (i = 0; *(t+i)!='\0'||'\n'; i++) { fin >> *(t+i); }
    std::cout << *(t+i) << std::endl;

пусто =\

mes, ну а как же smile ! Вот уже писал и fin, и fout.  И вашим примером воспользовался, и все равно не так) Правда не понял строчки (;fin.eof(); ... ), там, полагаю, перед ";" должно что то быть  smile .
Anikmar, спасибо, попробую.
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 23.3.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



уххх подразобрался с чтением, спс mes, правда, каждый символ идет на отдельной строчке   smile 
--------------------
Неродивый студент
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.