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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема при отладке, Debug assertion Failed  
V
    Опции темы
aleknek
Дата 9.12.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не могу нормально отладить программу! Вылетает  сообщение:


    Debug assertion Failed
    Program: d:\проекты\указатель\debug\указатель.exe
    File: isctype.c
    Line: 68

    Expression: (unsigned)(c+1)<=256 

Смотрел файл isctype.c , не могу вычислить где ошибка ? 
  
Собственно сам код:
Код

// выделение слов из массива символов, вычисления с указателями
#include "stdafx.h"
#include"locale.h"
#include"ctype.h"
#include"string.h"
#include"iostream"
using namespace std;

bool GetWord (char* string, char* word, int& wordOffset);

int _tmain(int argc, _TCHAR* argv[])

{
    //________________________________________
    setlocale(LC_CTYPE,".1251");
    setlocale(LC_MONETARY,".1251");

   //_________________________________________

    const int bufferSize=255;
    char buffer [bufferSize+1];  // переменная для хранения всей строки
    char word   [bufferSize+1];  // переменная для хранения слова
    int wordOffset = 0;

    cout << "Введите строку \n";
    cin.getline(buffer,bufferSize);

    while(GetWord(buffer,word,wordOffset))
    {
        cout << "Got this word:" << word << endl;
    }

    return 0;
}


bool GetWord(char* string, char* word, int& wordOffset)

{
if (!string[wordOffset]) // определяет конец строки
return false;

char *p1, *p2;
p1=p2=string+wordOffset; // указатель на следующее слово

// удаляем ведущие пробелы
for(int i=0; i<(int)strlen(p1) && ! isalnum(p1[0]); i++)
p1 ++;

// проверка наличия слова
if (! isalnum(p1[0]))
return false;

// указатель р1 показывает начало следующего слова, также как и р2
p2=p1;

// перемещаем р2 в конец слова
while (isalnum(p2[0]))
p2++;

// р2 указывает на конец слова, а р1 на начало. Разность указателей показывает  длину слова.
int len= int(p2-p1);

// копируем слово в буфер.
strncpy(word,p1,len);

// и добавляем символ разрыва строки
word [len]='\ 0';

// ищем начало следующего слова
for (int i =int(p2-string); i<(int)strlen(string) && ! isalnum(p2[0]);i++)
p2++;

wordOffset=int(p2-string);
return true;
}




Это сообщение отредактировал(а) aleknek - 9.12.2007, 19:23
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



На какой строке исходного кода?

Цитата(aleknek @  9.12.2007,  18:46 Найти цитируемый пост)
// перемещаем р2 в конец слова
while (isalnum(p2[0]))
p2++;

не проверяешь выход за слово. Возможно переполнение.
Цитата(aleknek @  9.12.2007,  18:46 Найти цитируемый пост)
Вылетает  сообщение:




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
aleknek
Дата 9.12.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

не проверяешь выход за слово. Возможно переполнение.

Как организовать проверку выхода за слово ?
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(aleknek @  9.12.2007,  20:56 Найти цитируемый пост)
Как организовать проверку выхода за слово ? 

узнать strlen'ом длину и поставить в while дополнительное условие на счётчик операций (или на разницу указателей)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zkv
Дата 10.12.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



судя по всему вылетает на isalnum(), локаль надо советскую поставить  smile 
PM MAIL   Вверх
Random13
Дата 10.12.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Интересно, а _tmain вместо обычного мэйн - это в какой среде пишеться в борланде что-ли ?
В борланде никогда не работал ?
PM MAIL   Вверх
zkv
Дата 10.12.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Random13 @  10.12.2007,  09:14 Найти цитируемый пост)
Интересно, а _tmain вместо обычного мэйн

это TCHAR версия, ссылка
PM MAIL   Вверх
aleknek
Дата 15.12.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Random13 @  10.12.2007,  09:14 Найти цитируемый пост)
Интересно, а _tmain вместо обычного мэйн - это в какой среде пишеться в борланде что-ли ?
В борланде никогда не работал ? 

Пишется это все в Microsoft Visual Studio 2005



Цитата(zkv @  10.12.2007,  09:09 Найти цитируемый пост)
судя по всему вылетает на isalnum(), локаль надо советскую поставить

Как это сделать ?

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


Новичок



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

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



Код
char *setlocale(
   int category,
   const char *locale 
);

Для русской локали это выглядит примерно так:
Код
setlocale(LC_ALL, "rus");

смотри  MSDN.

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


Новичок



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

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



Цитата(zkv @  10.12.2007,  09:09 Найти цитируемый пост)
судя по всему вылетает на isalnum(), локаль надо советскую поставить



Цитата(aleknek @  9.12.2007,  18:46 Найти цитируемый пост)
setlocale(LC_CTYPE,".1251");
setlocale(LC_MONETARY,".1251");

А это разве не русская локаль ??


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


Эксперт
****


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

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



Тут две проблемы: 

1. т.к. приложение консольное, должна использоваться локаль 866.
Т.е. нужен setlocale(LC_CTYPE,".866"); Это для того что бы правильно отрабатывал isalnum для русских букв.

2. int isalnum(int) - на входе целое.
Ошибка такая:
Цитата

Expression: (unsigned)(c+1)<=256 


понятно, что все буковки с кодом больше 127 представляются ... как отрицательные! и (unsigned)(c+1) значительно больше 256.

вывод - использовать unsigned char всместо char в коде либо выставить в свойствах компиляции 
Language->Default Char Unsigned->Yes

Кстати там еще ошибка в коде - '\ 0', т.е. пробел между \ и 0

Добавлено через 1 минуту и 47 секунд
JackYF, что касается циклов там все в порядке, так как завершающий '\0' однозначно не isalnum

Добавлено через 12 минут и 21 секунду
Вообще полезно использовать unsigned char, если предпологается хранить там строки с родным нам русским языком. Во избежание многих проблем.
пример:
Код

  char str1[] = { 'Z', 'Я' };
  unsigned char str2[] = { 'Z', 'Я' };
  std::boolalpha (std::cout);
  std::cout << (str1[0] < str1[1]) << " vs " << (str2[0] < str2[1]);

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


Новичок



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

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



Всем огромное спасибо, проблема решилась при подключении 866 локали и изменении свойств компиляции.  
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.1000 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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