String wird nicht ausgegeben



  • Guten Tag miteinander,

    Ich bin ein Anfänger im C-Programmieren und habe folgendes Problem:
    Beim folgenden Code wird der String nicht ausgegeben. Wenn ich den Datentyp der Variable "Zahl" jedoch in int ändere, so funktioniert das Programm.
    Woran liegt das?

    int main() {
    
       /* lokale Variablen */
       char Array[50];
       char Zahl;	// Wenn dieser Datentyp int, dann funktioniert es
       int Index;
    
       scanf("%s",Array);
       scanf("%d",&Zahl);
       scanf("%d",&Index);
    
       printf("%s\n", Array);
       printf("%d\n",Zahl);
       printf("%d\n", Index); 
    
       system ("PAUSE");
       return (0);
    


  • schalte die Warnungen von deinem compiler ein
    %d ist für int gedacht
    was verstehst du unter funktionieren
    welcher string



  • Du liest einen int ein, wo nur Platz für einen char ist.
    D.h., wenn ein int z.B. vier Bytes hat, schreibt scanf("%d", &Zahl); das erste Byte in Zahl und dann noch drei weitere Bytes.
    In Deinem Fall landet mindestens eins davon als Nullterminierung in Deinem char[] .

    Gib mal eine extreme Zahl an: z.B. -1, mit hoher Wahrscheinlichkeit siehtst Du Speichermüll und dann einen Teil Deines Arrays.

    Warnungen im Compiler einschalten und beachten!



  • Aber ist es nicht möglich Ganzzahlige werte, die nicht grösser oder kleiner 127 sind in ein char einzulesen?



  • gary1195 schrieb:

    schalte die Warnungen von deinem compiler ein
    %d ist für int gedacht
    was verstehst du unter funktionieren
    welcher string

    Unter funktionieren verstehe ich, dass alles so ausgegeben wird, wie es vorher eingelesen wurde.
    Mit String ist Array gemeint.



  • MUGUMAN schrieb:

    Aber ist es nicht möglich Ganzzahlige werte, die nicht grösser oder kleiner 127 sind in ein char einzulesen?

    Also ein signed char . Dann %hhi , oder %hhd .
    Ein einfacher char könnte ja auch unsigned sein.

    Hast Du selbst keine Dokumentation zu scanf() ?



  • Nein leider nicht.

    Aber wenn ich nur die beiden Variablen Zahl und Index mit dem Datentyp char definieren würde und mit scanf("%d") z.B. 10 einlesen würde, so würde doch auch der Zahlenwert 10 in der Variable stehen.



  • Ich glaube ich habe die Problematik nun verstanden:
    Ich kann mit %d keinen Wert in eine char Varible einlesen. Aber ein char Datentyp kann verwendet werden, um mit kleinen Ganzzahlen zu rechnen.
    Stimmt diese Aussage?



  • MUGUMAN schrieb:

    Nein leider nicht.

    Gibt's im Internet.

    MUGUMAN schrieb:

    Aber wenn ich nur die beiden Variablen Zahl und Index mit dem Datentyp char definieren würde und mit scanf("%d") z.B. 10 einlesen würde, so würde doch auch der Zahlenwert 10 in der Variable stehen.

    Erstmal gibt es gar keinen Grund, keinen int zu nehmen - ganz im Gegenteil könnte man argumentieren in einen größeren Datentyp einzulesen, um danach bequem auf zu große, bzw. zu kleine Eingabewerte zu überprüfen. Du gewinnst jedenfalls nicht wirklich etwas, wenn Du einen char benutzt. Es sei denn, Du hast Millionen und Abermillionen von solchen Zahlen.

    Und weiterhin: Die Größe eines Datentyps ist unabhängig von seinem Inhalt:

    Bei mir z.B. gilt sizeof(int)==4 .
    Gegeben

    int a=10, b=4294967295;
    

    gilt sizeof(a)==sizeof(b);

    Was macht scanf() ?
    scanf() liest Zeichen ein, wandelt die - bei %d - in einen int um und schreibt die an die Stelle auf die der übergebene Zeiger zeigt.
    In meinem (und wahrscheinlich auch bei Deinem) System benötigt ein int 4 Byte. Wenn ich jetzt einen Zeiger auf einen einzigen char übergebe passt der int nicht und es passiert ein Fehler.

    MUGUMAN schrieb:

    Ich kann mit %d keinen Wert in eine char Varible einlesen. Aber ein char Datentyp kann verwendet werden, um mit kleinen Ganzzahlen zu rechnen.
    Stimmt diese Aussage?

    Ja.

    Muss weg... Viel Erfolg! 🙂



  • Danke für die schnelle Hilfe 😉


Anmelden zum Antworten