2015-01-21 3 views
1

Нижеприведенный код работает для каждого символа I, за исключением £ или ¬.isdigit поднимает утверждение отладки при вводе £ и ¬

Почему я получаю сообщение об ошибке отладки?

#include <iostream> 
#include <string> 
#include <cctype> 
using namespace std; 

int main() { 
    string input; 
    while (1) { 
     cout << "Input number: "; 
     getline(cin, input); 
     if (!isdigit(input[0])) 
      cout << "not a digit\n"; 
    } 
} 
+2

Всегда полезно скопировать/вставить точное сообщение об ошибке. В противном случае мы должны угадать. –

+1

Какая у вас локаль? Есть ли в ASCII? Есть ли в UTF-8? Являются ли эти многобайтовые символы? –

+0

Что такое компилятор/библиотека и версии? – sehe

ответ

2

The microsoft docs say:

C++ компилятор обрабатывает переменные типа полукокса, подписанный полукокса и беззнаковых символов, как имеющие разные типы. Переменные типа char присваиваются int, как если бы они были типом подписанного символа по умолчанию, если не используется параметр компиляции/J. В этом случае они рассматриваются как тип unsigned char и продвигаются до int без расширения знака.

And they also say:

Поведение isdigit и _isdigit_l является не определен, если c не EOF или в диапазоне 0 через 0xFF включительно. Когда используется библиотека отладочной CRT, а c не является одним из этих значений, функции поднимают утверждение.

Так char по-умолчанию signed, что означает, как эти два символа не ASCII они являются отрицательными в вашей ANSI кодировке, и, таким образом, вы получите утверждение.

+0

Любые идеи, как я могу это исправить? –

+0

Вставить 'unsigned char' (стандартно-совместимый способ) или передать'/J' вашему компилятору, чтобы сделать 'char' unsigned (ленивым, но иногда необходимым для принятия больших базовых кодов, которые трудно исправить), так как приведенная страница показывает. – Deduplicator

+0

Отлично! Большое спасибо! –

2

The Microsoft docs говорят:

Поведение isdigit и _isdigit_l не определен, если с не EOF или в диапазоне от 0 до 0xFF включительно. Когда используется библиотека отладочной CRT и c не является одним из этих значений, функции вызывают утверждение.

(я предполагаю, что Microsoft из-за комментарий о «окне ошибки», но документы для других реализаций поместить тот же предел на значении аргументов.)

EDIT: как заметил Deduplicator, ошибка, вероятно, возникает по умолчанию char, который подписывается на этой платформе, так что вы передаете отрицательные значения (отличные от EOF). std::string использует char, а не широкие символы, поэтому мой первоначальный вывод не может быть прав.

+1

'string' является' std :: string' и, следовательно, явно 'char', а не' wchar_t' ... – Deduplicator

+0

@JohnBollinger: –

Смежные вопросы