2016-08-31 2 views
3

Этот код объединяет часть большого кода базы данных в C. В этой части участвуют ученики. требования должны использоваться typedef unsigned char uint8 вместо простого int. Для меня жизни я не могу заставить его работать. Когда я использую% c в scanf, он пропускает. При печати, если он печатает первую цифру. Итак, это код с int, и он работает нормально, как я могу заставить его работать с uint8 или unsigned char ???uint8 с scanf и printf в C

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <ctype.h> 
#include <inttypes.h> 
#include <string.h> 
//typedef unsigned char uint8; 
typedef unsigned int uint8; 
int main(void) 
{ 
    uint8 grades_t[3], gr_c, g_temp; 
    for (gr_c = 0; gr_c < 3;) 
     { 
      printf("please enter the grade (0-100) of subject no%d: ", gr_c+1); 
      scanf("%d", &g_temp); 
      if (g_temp < 0 || g_temp > 100) //only accept values between 0-100 
       { 
        printf("please enter valid grade from 0 - 100!\n"); 
        gr_c --; //if value is out of range, decrement 
       } 

      else //store value 
       { 
        grades_t[gr_c] = g_temp; 

       } 
      gr_c++; 
     } 
     printf("grade = %d\n", grades_t[0]); //unite test 
     printf("grade = %d\n", grades_t[1]); 
     printf("grade = %d", grades_t[2]); 
    return 0; 
} 
+0

Добро пожаловать на Stack Overflow. Обратите внимание, что предпочтительный способ сказать «спасибо» здесь ответы на вопросы и полезные ответы (если у вас достаточно репутации, чтобы это сделать), и, приняв наиболее полезный ответ на любой интересующий вас вопрос (что также дает вам небольшой импульс для вашей репутации ). См. Страницу [About], а также [Как задать вопросы здесь?] (Http://stackoverflow.com/help/how-to-ask) и [Что мне делать, когда кто-то отвечает на мой вопрос ? ?] (http://stackoverflow.com/help/someone-answers) –

ответ

4

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

unsigned char u1; // Or, given typedef unsigned char uint8; uint8 u1; 

if (scanf("%hhu", &u1) != 1) 
    …oops… 

printf("Value: %d\n", u1); 

hh в scanf() преобразования указывает, что указатель предоставленная на (без знака) char. Нет необходимости в соответствующем изменении в printf(), так как u1 будет автоматически повышаться до int. Тем не менее, если вы хотите, вы можете использовать:

printf("Value: %hhu\n", u1); 

Это сохраняет симметрию в printf() и scanf(). Я заметил, что макросы в <inttypes.h> не применимы напрямую. Макросы, такие как SCNu8 и PRIu8, относятся к uint8_t, а не к uint8. Тем не менее, они, вероятно, можно было бы использовать, и они, вероятно, работать OK - если они предусмотрены в <inttypes.h> на всех:

if (scanf("%" SCNu8, &u1) != 1) 
    …oops… 

printf("Value: %" PRIu8 "\n", u1); 
+0

im относительно новое, поэтому .. Im using Code :: Blocks v16.01 и из того, что я вижу, используя GNU GCC. также% hhu дал ошибку, поэтому я предполагаю, что это. я могу что-то изменить, чтобы использовать C99 или C11. также Если вы можете дать мне ссылку на использование SCNu8 и PRIu8 – gamalanwer

+0

Вы используете CodeBlocks в системе на базе Unix (Linux, Mac, BSD и т. Д.) Или в Windows? Если, как я подозреваю, вы работаете в Windows, то проблема в том, поддерживает ли библиотека времени выполнения нотацию 'hh'. У вас может быть больше удачи, чем у меня (Google просто решил обслуживать меня на русских страницах), но ['scanf()' width specification] (https://msdn.microsoft.com/ru-ru/subscriptions/xdb9w69d (v = vs .90) .aspx) может помочь - текст в основном по-английски; он не перечисляет 'hh', что не является большим сюрпризом, поскольку среда выполнения MS не полностью совместима с C99. –

+0

MS, к сожалению. могу ли я использовать SCNu8 и PRIu8? и если да, то как? заранее спасибо. – gamalanwer

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