2016-08-31 4 views
3

Dieser Code unite ist ein Teil eines größeren Codes einer Datenbank in C. Dieser Teil nimmt Noten von Studenten. Anforderungen sind typedef unsigned char uint8 statt einer einfachen int zu verwenden. Für das Leben von mir kann ich es nicht funktionieren lassen. Wenn ich% c in scanf verwende, überspringt es. Im Ausdruck, wenn manchmal die erste Ziffer gedruckt wird. Also das ist der Code mit int und es funktioniert gut, wie mache ich es mit Uint8 oder unsigned char ???uint8 mit scanf und printf in 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

Willkommen Überlauf zu stapeln. Bitte beachten Sie, dass die bevorzugte Art zu sagen "Danke" hier ist durch Up-Voting gute Fragen und hilfreiche Antworten (sobald Sie genug Ruf zu tun haben), und durch die Annahme der hilfreichsten Antwort auf alle Fragen Sie fragen (Das gibt Ihnen auch einen kleinen Schub für Ihre Ruf). Bitte lesen Sie die [Über] Seite und auch [Wie stelle ich Fragen? hier?] (Http://stackoverflow.com/help/how-to-ask) und [Was mache ich, wenn jemand meine Frage beantwortet ?] (http://stackoverflow.com/help/someone-answers) –

Antwort

4

Sie wollen die unsigned char als eine kleine ganze Zahl zu behandeln, nicht als ein Zeichen. Unter der Annahme, C99 oder später werden Sie verwenden:

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

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

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

Die hh in der scanf() Umwandlung gibt an, dass der Zeiger wird an einen (unsigned) char. Die entsprechende Änderung in printf() ist nicht erforderlich, da u1 automatisch auf int heraufgestuft wird. Allerdings, wenn Sie möchten, können Sie verwenden:

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

Dies bewahrt die Symmetrie in printf() und scanf(). Ich stelle fest, dass die Makros in nicht direkt anwendbar sind. Die Makros wie SCNu8 und PRIu8 gelten für uint8_t, nicht für uint8. Das heißt, sie wahrscheinlich verwendet werden könnten, und sie würden wahrscheinlich OK arbeiten - vorausgesetzt, sie in <inttypes.h> vorgesehen sind, an alle:

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

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

Ich bin relativ neu, also .. Ich benutze Code :: Blocks v16.01 und von dem, was ich sehen kann, mit GNU GCC. auch% hhu gab Fehler, also nehme ich an, dass. Kann ich etwas ändern, um C99 oder C11 zu verwenden? auch Wenn Sie können Sie mir eine Referenz zur Verwendung von SCNu8 und PRIu8 geben – gamalanwer

+0

Führen Sie CodeBlocks auf einem Unix-basierten System (Linux, Mac, BSD, etc) oder unter Windows? Wenn, wie ich vermute, Sie auf Windows sind, dann ist das Problem, ob die Laufzeitbibliothek die 'hh'-Notation unterstützt. Sie haben vielleicht mehr Glück als ich (Google hat sich gerade entschieden, mir russische Seiten anzubieten), aber ['scanf()' width specification] (https://msdn.microsoft.com/ru-ru/subscriptions/xdb9w69d (v = vs .90) .aspx) kann helfen - der Text ist meist Englisch; Es enthält nicht "hh", was keine große Überraschung ist, da die MS-Laufzeit nicht vollständig C99-konform ist. –

+0

MS, leider. kann ich SCNu8 und PRIu8 verwenden? und wenn ja, wie? Danke im Voraus. – gamalanwer