Drucken eines Zeichens mit printf

Lesezeit: 7 Minuten

Sind diese beiden Codes gleich

char ch="a";
printf("%d", ch);

Wird es einen Garbage-Wert drucken?

Ich bin darüber verwirrt

printf("%d", '\0'); 

Wird dies 0 oder Müllwert drucken? Denn wenn ich das mache

printf("%d", sizeof('\n')); 

Es druckt 4. Warum ist sizeof('\n') 4 Bytes? Dasselbe in C++ gibt 1 Byte aus. Warum ist das so?

Hier ist also die Hauptfrage

in C-Sprache ist printf("%d", '\0') soll 0 ausgeben

und in C++ printf("%d", '\0') Soll Müll drucken?

%d druckt eine Ganzzahl: Es wird die ASCII-Darstellung Ihres Zeichens gedruckt. Was Sie brauchen, ist %c:

printf("%c", ch);

printf("%d", '\0'); druckt die ASCII-Darstellung von '\0'was 0 ist (indem Sie 0 maskieren, weisen Sie den Compiler an, den ASCII-Wert 0 zu verwenden.

printf("%d", sizeof('\n')); gibt 4 aus, weil ein Zeichenliteral ein ist intin C und nicht a char.

  • @nightcracker: hm? Wenn printf("%d", ch); “druckt einen Müllwert”, ich denke, weil er drucken wollte Aanstelle seines ASCII-Werts …

    – Junge

    19. Januar 2011 um 15:02 Uhr

  • Er hat nie gesagt, dass irgendetwas einen Müllwert gedruckt hat, er hat gefragt, ob es so ist oder nicht.

    – orlp

    19. Januar 2011 um 15:04 Uhr

  • @nightcracker: hm, was ist der unterschied? Ich verstehe deinen Punkt nicht.

    – Junge

    19. Januar 2011 um 15:19 Uhr

  • Einfach ausgedrückt, Ihre Antwort ist keine Antwort auf die Frage des OP. Er war einfach neugierig auf die Ergebnisse von %d Druckzeichen, %c ist völlig unabhängig.

    – orlp

    19. Januar 2011 um 15:26 Uhr

  • Das ist eigentlich genau das, wonach ich gesucht habe (über die Suchmaschine hierher gekommen). Auch wenn es die ursprüngliche Frage von OP nicht beantwortet, wird es anderen helfen

    – bobroxsox

    23. Februar 2017 um 21:54 Uhr

Dies soll den ASCII-Wert des Zeichens als ausgeben %d ist die Escape-Sequenz für eine ganze Zahl. Also der Wert, der als Argument von angegeben wird printf wird beim Drucken als Integer genommen.

char ch="a";
printf("%d", ch);

Gleiches gilt für printf("%d", '\0');wobei das NULL-Zeichen als Ganzzahl 0 interpretiert wird.

Endlich, sizeof('\n') ist 4, weil in C diese Schreibweise für Zeichen für die entsprechende ASCII-Ganzzahl steht. Also ist ‘\n’ dasselbe wie 10 als ganze Zahl.

Es hängt alles von der Interpretation ab, die Sie den Bytes geben.

  • +1, also gibt printf(“%d”, ch) (int) 97 und printf(“%d”, ‘\0’) (int) 0 aus

    – Schwarzbär

    19. Januar 2011 um 15:12 Uhr

  • Ich würde das sagen als “Also ist ‘\n’ ein Int, 32 Bit, 4 Bytes und sizeof() gibt 4 zurück Wert von ‘\n’ ist 10, dezimal. NEWLINE in ASCII.” Der ursprüngliche einzelne Satz ist wahr, aber vielleicht zu knapp.

    – Rechnung IV

    8. April 2011 um 23:20 Uhr


Benutzer-Avatar
Orlp

In C char wird befördert int in Ausdrücken. Das erklärt so ziemlich jede Frage, wenn man darüber nachdenkt.

Quelle: Die Programmiersprache C von Brian W.Kernighan und Dennis M.Ritchie

Unbedingt lesen, wenn man C lernen möchte.

Sehen Sie sich auch diese Stapelüberlaufseite an, auf der Leute, die viel erfahrener sind als ich, es viel besser erklären können als ich es jemals kann.

  • @BlackBear: Ja, weil (auf den meisten Systemen) ein Zeichen ein Byte und ein Int vier ist, also ist es eine Beförderung.

    – orlp

    19. Januar 2011 um 15:02 Uhr

  • Ich zitiere wörtlich das Buch, sie verwenden das Wort Werbung. Es ist dasselbe wie ein int-Cast (glaube ich).

    – orlp

    19. Januar 2011 um 15:06 Uhr

  • Ich gebe dir +1 für den Link. Das Wort Promotion verwirrt mich zwar immer noch, aber ich denke, du bist klar ;).

    Benutzer418748

    19. Januar 2011 um 15:09 Uhr

  • Der Begriff “Promotion” wird auch im C-Sprachstandard, Abschnitt 6.3.1.1 verwendet.

    – Johannes Bode

    19. Januar 2011 um 15:26 Uhr

  • Die Promotion-Erklärung ist nicht sehr präzise. sizeof('a') ist 4 aber sizeof(ch) ist 1 wenn ch ist ein char. In C ist der Ausdruck 'a' ist das gleiche wie (int) 97. Es gibt keine Förderung. In C++ hat dieser Ausdruck jedoch einen Typ char.

    – scoffey

    19. Januar 2011 um 15:38 Uhr

In C können Zeichenkonstantenausdrücke wie z '\n' oder 'a' Typ haben int (daher sizeof '\n' == sizeof (int)), während sie in C++ Typ haben char.

Die Aussage printf("%d", '\0'); sollte einfach 0 ausgeben; die Art des Ausdrucks '\0' ist intund sein Wert ist 0.

Die Aussage printf("%d", ch); sollte die Ganzzahlcodierung für den Wert in ausgeben ch (für ASCII, 'a' == 97).

Benutzer-Avatar
Spinooosa

#include <stdio.h>
#include <stdlib.h>

int func(char a, char b, char c) /* demonstration that char on stack is promoted to int !!!
                                    note: this promotion is NOT integer promotion, but promotion during handling of the stack. don't confuse the two */
{
  const char *p = &a;
  printf("a=%d\n"
         "b=%d\n"
         "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this)
}


int main(void)
{
  func(1, 2, 3);

  //printf with %d treats its argument as int (argument must be int or smaller -> works because of conversion to int when on stack -- see demo above)
  printf("%d, %d, %d\n", (long long) 1, 2, 3); // don't do this! Argument must be int or smaller type (like char... which is converted to int when on the stack -- see above)



  // backslash followed by number is a oct VALUE
  printf("%d\n", '\377');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int. (this promotion has nothing to do with the stack. don't confuse the two!!!) */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  // backslash followed by x is a hex VALUE
  printf("%d\n", '\xff');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  printf("%d\n", 255);                // prints 255


  printf("%d\n", (char)255);          // prints -1   -> 255 is cast to char where it is -1
  printf("%d\n", '\n');               // prints 10   -> Ascii newline has VALUE 10. The char 10 is integer promoted to int 10
  printf("%d\n", sizeof('\n'));       // prints 4    -> Ascii newline is char, but integer promoted to int. And sizeof(int) is 4 (on many architectures)
  printf("%d\n", sizeof((char)'\n')); // prints 1    -> Switch off integer promotion via cast!

  return 0;
}

  • Bitte beschränken Sie Ihre Zeilen auf 90 Zeichen. Eine Hälfte Ihres Textes ist ausgeblendet.

    – AL

    28. Februar 2014 um 23:03 Uhr

  • @AL Beschuldigen Sie diese verrückten hochauflösenden 16: 9-Displays! Mit dem programmiererfreundlichen Seitenverhältnis von 4:3 würde niemand jemals so verrückte lange Zeilen schreiben 😉

    – BitTickler

    17. Februar 2021 um 0:00 Uhr

Benutzer-Avatar
Jens

Ja, es druckt GARBAGE, es sei denn, Sie haben Glück.

SEHR WICHTIG.

Der Typ des Arguments printf/sprintf/fprintf MUSS mit dem zugehörigen Formattyp char übereinstimmen.

Wenn die Typen nicht übereinstimmen und kompiliert wird, sind die Ergebnisse sehr undefiniert.

Viele neuere Compiler kennen printf und geben Warnungen aus, wenn die Typen nicht übereinstimmen. Wenn Sie diese Warnungen erhalten, BEHEBEN Sie sie.

Wenn Sie Typen für Argumente für Variablenfunktionen konvertieren möchten, müssen Sie die Umwandlung (dh explizite Konvertierung) bereitstellen, da der Compiler nicht herausfinden kann, dass eine Konvertierung durchgeführt werden muss (wie dies bei einem Funktionsprototypen mit typisierten Argumenten der Fall ist). .

printf("%d\n", (int) ch)

In diesem Beispiel wird printf mitgeteilt, dass sich ein „int“ auf dem Stack befindet. Die Umwandlung stellt sicher, dass, was auch immer sizeof zurückgibt (normalerweise eine Art langer Integer), printf ein int erhält.

printf("%d", (int) sizeof('\n'))

  • Bitte beschränken Sie Ihre Zeilen auf 90 Zeichen. Eine Hälfte Ihres Textes ist ausgeblendet.

    – AL

    28. Februar 2014 um 23:03 Uhr

  • @AL Beschuldigen Sie diese verrückten hochauflösenden 16: 9-Displays! Mit dem programmiererfreundlichen Seitenverhältnis von 4:3 würde niemand jemals so verrückte lange Zeilen schreiben 😉

    – BitTickler

    17. Februar 2021 um 0:00 Uhr

1372560cookie-checkDrucken eines Zeichens mit printf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy