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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по работе со строками 
:(
    Опции темы
xreal
Дата 21.6.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, возникли некоторые проблемки. Это часть программы, компилируется хорошо, но после запуска аварийно завершается. Хотелось бы уточнить кое-что по функциям. Вопросы буду писать в комментариях.

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{

    FILE *fp;
    int count[50], filesize, n=0, j=0, i, k=0, z=0, s, temp;
    char *myf, *ololo;
    char *mas[50];

    fp=fopen("source.txt","r");
    fseek(fp,0,SEEK_END);
    filesize=ftell(fp);
    fseek(fp,0,SEEK_SET);
    myf=(char*)(malloc(filesize));
    fread(myf,1,filesize,fp);
    ololo = strtok(myf," ,.!?\n\t:;");
    i=0;
    while (ololo != NULL)
    {
        mas[i] = strtok (NULL," ,.!?\n\t:;");   //почему в цикле переменная i растёт до 51, когда количество слов в файле 26?
        i++;
    }


    for (j=0; j < i; j++) 
    {
        count[j] = strlen(mas[j]); //вот тут дебаггер выдаёт мне эксепшн, при чём каждый раз в разное время, хотя текст подаётся один и тот же
    }

    for (j=0; j < i; j++)
    {
        printf ("%s\n", count[j]);
    }


}



Заранее спасибо.
PM MAIL   Вверх
bsa
Дата 21.6.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



1. Ты присваиваешь результат strtok переменной mas[i], а проверяешь ololo. i увеличивается до тех пор, пока ты не забьешь все переменные между массивом и ololo нулями. Т.е. если ты воткнешь еще одну переменную между ними, будет 52.
2. у тебя массив на 50 элементов. Если у тебя i больше 50, то ты выходишь за границу массива со всеми вытекающими
PM   Вверх
Dem_max
Дата 21.6.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



может так нужно
Код

char *mas[50];
mas[i]=(char*)malloc(size);

count[j] = strlen(mas[j]); //вот тут дебаггер выдаёт мне эксепшн,


а то у тебя 50 указателей mas на ничего, ты их даже не проинициализировал ( не выделил память)


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xreal
Дата 21.6.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1. А как сделать, чтобы массив забивался только пока есть слова?

2. Там выбрасывает не на 50+ там и на первом проходе цикла при j=0 выбрасывает
PM MAIL   Вверх
bsa
Дата 21.6.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



xreal, исправь первую ошибку, исправится и вторая.
Код
    ololo = strtok(myf," ,.!?\n\t:;");
    for(i = 0; ololo != NULL; ++i)
    {
        mas[i] = ololo;
        ololo = strtok (NULL," ,.!?\n\t:;");
    }

PM   Вверх
xreal
Дата 21.6.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал, как посоветовали, но как-то всё равно не работает. 

Код

  fp=fopen("source.txt","r"); //дебаггер пишет, что fp не может быть найден    


Это сообщение отредактировал(а) xreal - 21.6.2010, 11:45
PM MAIL   Вверх
xvr
Дата 21.6.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Кстати, считанные из файла данные нужно терминировать нулем. Иначе strtok может перелопатить всю память ПОСЛЕ образа, считанного из файла, в поисках конца строки (символа с нулевым кодом)

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


Шустрый
*


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

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



А варианты решения основной проблемы есть? 
PM MAIL   Вверх
neondartal
Дата 21.6.2010, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



myf=(char*)(malloc(filesize))

так будет без глюков

myf=(char*)(malloc(filesize+1))
myf[filesize] = '\0'




Это сообщение отредактировал(а) neondartal - 21.6.2010, 18:41
PM MAIL   Вверх
neondartal
Дата 21.6.2010, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



fopen - есть а fclose ??? Ведь при глюке он может быть еще открыт - обязательно надо закрывать все открытые файлы. И пропиши - точный путь к файлу.
PM MAIL   Вверх
xreal
Дата 21.6.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

fopen:
004038C0   push        ebp
004038C1   mov         ebp,esp
004038C3   push        40h
004038C5   mov         eax,dword ptr [mode]
004038C8   push        eax
004038C9   mov         ecx,dword ptr [file]
004038CC   push        ecx
004038CD   call        _fsopen (004037d0)
004038D2   add         esp,0Ch
004038D5   pop         ebp
004038D6   ret



я не могу понять почему мне такое дебаггер выдаёт, это на fopen

fclose написан, просто ниже по коду был.

Это сообщение отредактировал(а) xreal - 21.6.2010, 19:08
PM MAIL   Вверх
neondartal
Дата 21.6.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что если файл пока не использовать - отработай все на массиве в памяти, потом просто в массив загоняй файл. А то непонятно - что у тебя - вообще работает, или вообще ни разу - не работало. 

Тут только один вариант - файл не может найти, пропиши точный путь, если 
типа

c:/file.txt или "c:\\file.txt" не помню слэши надо или нет двойные.

Добавлено через 5 минут и 13 секунд
Вот пример из Help - запусти и проверь - тут на два файла пример.

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write 
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

   // Close stream if it is not NULL 
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closed\n" );
      }
   }

   // All other files are closed: 
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
   return 0;
}


Это сообщение отредактировал(а) neondartal - 21.6.2010, 19:16
PM MAIL   Вверх
xreal
Дата 21.6.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще-то изначально всё работало, и был вопросы только те, что вначале. Так что бред какой-то. Спасибо всем за помощь.
PM MAIL   Вверх
xvr
Дата 21.6.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(xreal @  21.6.2010,  19:07 Найти цитируемый пост)
я не могу понять почему мне такое дебаггер выдаёт, это на fopen
Потому что нет отладочной информации. Компилировать надо в Debug конфигурации


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


Шустрый
*


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

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



Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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