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:
weisen Sie ein int (n), um Ihre Nummer zu speichern
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;
}
13714800cookie-checkWie drucke ich eine ganze Zahl und eine Zeichenfolge in C richtig?yes
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