Wie drucke ich eine ganze Zahl und eine Zeichenfolge in C richtig?

Lesezeit: 2 Minuten

Benutzer-Avatar
Benutzer1420474

Ich habe folgenden Code:

char *s1, *s2;
char str[10];

printf("Type a string: ");
scanf("%s", str);

s1 = &str[0];
s2 = &str[2];

printf("%s\n", s1);
printf("%s\n", s2);

Wenn ich den Code ausführe und die Eingabe “A 1” wie folgt eingebe:

Type a string: A 1

Ich habe folgendes Ergebnis:

A
�<�

Ich versuche, das erste Zeichen als Zeichenfolge und das dritte Zeichen als Ganzzahl zu lesen und diese dann auf dem Bildschirm auszudrucken. Das erste Zeichen funktioniert immer, aber der Bildschirm zeigt danach nur zufällige Dinge an …. Wie soll ich es beheben?

  • Eine andere Sache, die die Leute eine Weile nicht erwähnt hatten: Bitte scannen Sie nicht in einen Puffer mit begrenzter Größe. Der Benutzer kann einfach mehr als das Limit eingeben und Ihr Programm über den Haufen werfen. (siehe auch: Pufferüberlaufangriffe)

    – Dennis Meng

    31. Juli 2012 um 2:54 Uhr


  • @DennisMeng: Man kann einen Breitenbezeichner hinzufügen, z %123s. Es ist immer noch potenziell gefährlich, da diese Breite das Null-Terminator nicht enthält.

    – Diapir

    7. Juni 2014 um 10:54 Uhr


  • @diapir Stimmt. Das wichtige Bit ist das Vermeiden des Pufferüberlaufs.

    – Dennis Meng

    7. Juni 2014 um 20:10 Uhr

Sie sind auf dem richtigen Weg. Hier eine korrigierte Version:

char str[10];
int n;

printf("type a string: ");
scanf("%s %d", str, &n);

printf("%s\n", str);
printf("%d\n", n);

Lassen Sie uns über die Änderungen sprechen:

  1. weisen Sie ein int (n), um Ihre Nummer zu speichern
  2. erzählen scanf zuerst einen String und dann eine Zahl einlesen (%d bedeutet Zahl, wie Sie es bereits von Ihrem wussten printf

Das ist so ziemlich alles, was dazu gehört. Ihr Code ist dennoch ein wenig gefährlich, da jede Benutzereingabe, die länger als 9 Zeichen ist, überläuft str und fangen Sie an, Ihren Stack zu trampeln.

  • Ahh vielen Dank!! wusste nicht, dass ich das so machen kann. Vielen Dank!

    – Benutzer1420474

    31. Juli 2012 um 2:54 Uhr

scanf("%s",str) scannt nur, bis es ein Leerzeichen findet. Mit der Eingabe "A 1"wird also nur das erste Zeichen gescannt s2 zeigt auf den Müll, der zufällig drin war strda dieses Array nicht initialisiert wurde.

  • Ja, mir ist aufgefallen, dass, wenn ich “ABCFS” eingebe, kein Müll angezeigt wird. Ich weiß jetzt wo das Problem liegt. Vielen Dank!

    – Benutzer1420474

    31. Juli 2012 um 2:55 Uhr

Probieren Sie diesen Code aus, mein Freund …

#include<stdio.h>
int main(){
   char *s1, *s2;
   char str[10];

   printf("type a string: ");
   scanf("%s", str);

   s1 = &str[0];
   s2 = &str[2];

   printf("%c\n", *s1);   //use %c instead of %s and *s1 which is the content of position 1
   printf("%c\n", *s2);   //use %c instead of %s and *s3 which is the content of position 1

   return 0;
}

1371480cookie-checkWie drucke ich eine ganze Zahl und eine Zeichenfolge in C richtig?

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

Privacy policy