2014-09-21 4 views
2

для следующей функцииToUpper возвращает целое число, а не символ

void display() 
{ 
    for (int i = 0; i < 8; i++) 
    { 
     for (int j = 0; j < 8; j++) 
     { 
      if (board[i][j] < 84 && (i+j)%2 == 0) 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x70); 
      else if (board[i][j] < 84 && (i+j)%2 == 1) 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xc0); 
      else if (board[i][j] > 97 && (i+j)%2 == 0) 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x7c); 
      else if (board[i][j] > 97 && (i+j)%2 == 1) 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xc7); 
      cout << " " << toupper(board[i][j]) << " "; 
     } 
     cout << endl; 
    } 
} 

вместо возвращения символов для полукокса борта [8] [8] возвращает целые числа, так мой вывод выглядит

82 78 66 81 75 66 78 82 

80 80 80 80 80 80 80 80 

32 32 32 32 32 32 32 32 

32 32 32 32 32 32 32 32 

32 32 32 32 32 32 32 32 

32 32 32 32 32 32 32 32 

80 80 80 80 80 80 80 80 

82 78 66 81 75 66 78 82 

а чем ожидаемый выход

R N B Q K B N R 

P P P P P P P P 




P P P P P P P P 

R N B Q K B N R 

Я также попытался объявить char a = board [i] [j]; cout < < toupper (a); в попытке подтвердить тип переменной как символ и получить тот же результат.

это назначение для класса, поэтому я не ожидаю большой помощи, я просто хочу знать, почему моя функция возвращает целые числа вместо символов, так что я знаю, что моя ошибка для будущей ссылки, Google didn ' много помогите. это какая-то проблема с объемом памяти?

+1

Вы пробовали литье возвращаемого значения 'toupper'? –

+0

Почему нет google в первую очередь для справки? – Abhi

+0

Если вам просто нужна функция, которая преобразует верхние символы ASCII в верхние символы ASCII, я предлагаю использовать (или записывать) функцию, специфичную для этой кодировки. Такая функция может быть безопасна по типу, т. Е. Иметь дело с 'char' вместо' int ', и не нужно иметь дело с локалями (-> быстрее). – dyp

ответ

0

Функция Toupper возвращает верхний регистр, эквивалентный c, если такое значение существует, или c (без изменений) в противном случае. Значение возвращается как значение int, которое может быть неявно выбрано для char.

http://www.cplusplus.com/reference/cctype/toupper/

+0

'EOF' однако является' int', который может быть передан 'toupper', но не может быть передан в' char' (если 'sizeof (int)> sizeof (char)'). – dyp

+0

вместо того, чтобы кастовать char to board [i] [j], я передал его непосредственно в toupper (board [i] [j]), и это, похоже, пропустило шаг, где char преобразуется в int, я думаю, потому что я 'm приведение его к символу в то же время, когда я звоню в toupper, так что, может быть, он переходит от char к int char? –

+0

@ dyp: Конечно, значение 'EOF' может быть преобразовано в' char'. Если 'char' не имеет знака, результат будет определен корректно.Если 'char' не имеет знака, результат будет определен так долго, как' EOF> = CHAR_MIN' (который обычно есть). Однако результат такого преобразования не особенно полезен. (Обычно 'EOF == -1'.) –

0

документация ясна: http://www.cplusplus.com/reference/cctype/toupper/

int toupper (int c); 

Таким образом, вы просто должны бросить в char:

cout << " " << (char) toupper(board[i][j]) << " "; 
+1

Боковое замечание: «Документация» - это всего лишь ** ** документация. Это не официальный. – dyp

+0

Извините, я не искал спецификации. –

+0

Я вижу, поэтому toupper преобразует в целочисленное значение, моим обходным путем был char a = toupper (board [i] [j]); поэтому я считаю, что тип данных поменял char на int на char, но я думаю, что ваше решение будет работать лучше, так как оно не потребует создания ненулевой переменной –

0

Вы должны использовать cout << char(toupper(board[i][j])); работать вокруг бестолковой типа возвращаемого топа.

2

Целью toupper является то, что он может работать на других языках, кроме английского, и, следовательно, он должен поддерживать вход и выход, который больше, чем 8 бит char, и поэтому должен возвращать то, что может быть преобразовано в unicode или символ UTF.

Просто просто отбрасывая его до char, вероятно, является источником ошибок кода в дальнейшем, в зависимости от цели вашего программного обеспечения.

Посмотрите на этот вопрос о том, как использовать его для широких символов и юникода.

Convert a unicode String In C++ To Upper Case

+3

C, §7.4 «Заголовок' '' объявляет несколько функций, полезных для классификация и отображение символов. Во всех случаях ** аргумент является «int», значение которого должно быть представлено как «unsigned char» или должно быть равно значению макроса 'EOF' **. Если аргумент имеет какой-либо другое значение, поведение не определено ». То, что параметр не является символом 'char', не имеет ничего общего с Unicode. Это, вероятно, не имеет ничего общего с локалями. См. Http://stackoverflow.com/q/17452847 и http://stackoverflow.com/q/5919735 – dyp

+0

Вы цитируете стандарт «C», но вопрос о «C++», и, как сообщается, функции работают для std :: wchar в соответствии с http://stackoverflow.com/questions/17991431/convert-a-unicode-string-in-c-to-upper-case - я сам не пробовал, и я не искал Стандарт C++, если «неопределенное» поведение в C определено в C++ – Soren

+0

Это функции, «импортированные» из стандартной библиотеки C в C++. Они явно не определены для C++, но только через ссылку на стандарт C. 'wchar_t' и т. д. не обязательно связаны с Unicode. Так как в типичных реализациях «unsigned char» может представлять значения в [0, 255], он не может использоваться, например. UTF-8 напрямую. – dyp