Daten abfragen - scanf() macht Probleme
-
Hallo ihr Lieben,
mal wieder macht scanf() bei mir Probleme.
Ich habe schon den Tipp angewendet, den ich neulich bekommen hatte, in dem es hieß, dass ich bei scanf(), wenn es um chars geht, hinter dem Prozentzeichen ein Leerzeichen lassen soll. Aber das klappt bei diesem Programm auch nicht (nicht überall).
Nach dem ich den Nachnamen eingegeben habe, erscheint in der nächsten Zeile vor meiner Eingabe eine Art Smileyzeichen.
Was ist da los und wie behebe ich das Problem?
Ich danke für jede Unterstützung!#include <stdio.h> int main() { char firstname[30]; char lastname[30]; char birthdate[20]; char mobile[20]; printf("Bitte Vornamen eingeben: "); scanf(" %s", &firstname); printf("Bitte Nachnamen eingeben: "); scanf(" %s", &lastname); printf("Bitte Geburtsdatum eingeben: %s", birthdate); scanf(" %s", &birthdate); printf("Bitte Handynummer eingeben: %s", mobile); scanf(" %s", &mobile); printf("Name : %s %s\n", firstname, lastname); printf("Geburtsdatum : %s\n", birthdate); printf("Handynummer : %s\n", mobile); return(0); }
-
Erklär mal Zeilen 14 und 16.
-
In Zeile 14 soll das Datum in etwas so eingegeben werden: 19.01.2023
In Zeile 16 die Handynummer (dabei soll es dem Nutzer überlalssen bleiben, welche Form er wählt.
-
Ich IDIOT!
Sorry, dieer Thread hat nie stattgefunden - Oh man, peinlich!!!
-
Bei char-Arrays und %s gehört bei scanf kein & dazu.
Der Name des Arrays steht schon für dessen Anfangsadresse.@Hawaiihemd sagte in Daten abfragen - scanf() macht Probleme:
Ich habe schon den Tipp angewendet, den ich neulich bekommen hatte, in dem es hieß, dass ich bei scanf(), wenn es um chars geht, hinter dem Prozentzeichen ein Leerzeichen lassen soll.
Das Leerzeichen gehört vor das %
Dieser Tipp funktioniert aber nur bei %c und %[ , weil bei den anderen Formatspecifieren (z.B. %d, %f, %s, …) Whitespace automatisch überlesen werden.
-
@DirkB sagte in Daten abfragen - scanf() macht Probleme:
Bei char-Arrays und %s gehört bei scanf kein & dazu.
Der Name des Arrays steht schon für dessen Anfangsadresse.Ne das&
passt schon. Es ist nur nicht nötig.
-
@hustbaer sagte in Daten abfragen - scanf() macht Probleme:
@DirkB sagte in Daten abfragen - scanf() macht Probleme:
Bei char-Arrays und %s gehört bei scanf kein & dazu.
Der Name des Arrays steht schon für dessen Anfangsadresse.Ne das
&
passt schon. Es ist nur nicht nötig.scanf erwartet bei %s einen Zeiger auf char,
Mit dem & ist es ein Zeiger auf ein char[20].Der Wert ist derselbe, der Typ ist anders.
Stur das & bei scanf zu benutzen, bringt dann in einer Funktion viel Freude.
-
@DirkB sagte in Daten abfragen - scanf() macht Probleme:
scanf erwartet bei %s einen Zeiger auf char,
Mit dem & ist es ein Zeiger auf ein char[20].Der Wert ist derselbe, der Typ ist anders.
OK. Du hast wohl Recht. In der Praxis macht es keinen Unterschied, aber streng genommen ist es vermutlich falsch.
Stur das & bei scanf zu benutzen, bringt dann in einer Funktion viel Freude.
Verstehe nicht was du damit sagen willst.
-
@hustbaer sagte in Daten abfragen - scanf() macht Probleme:
Stur das & bei scanf zu benutzen, bringt dann in einer Funktion viel Freude.
Verstehe nicht was du damit sagen willst.
Vermutlich so etwas:
void read(char str[]) { scanf("%s", &str); // Kabumm! }
-
@hustbaer sagte in Daten abfragen - scanf() macht Probleme:
OK. Du hast wohl Recht. In der Praxis macht es keinen Unterschied, aber streng genommen ist es vermutlich falsch.
char firstname[30]; scanf(" %s", &firstname);
Ist UB weil char** typinkompatibel zu char* ist (weil char* typinkompatibel zu char ist).
Korrekt ist alleinif( 1==scanf("%29[^\n]",firstname) ) ...
-
Wenn wir schon überkorrekt sind:
%[^\n]
macht was anderes als%s
.
-
@SeppJ
Dass mein Code was anders macht als der Originalcode war der Sinn meines Beitrages.
-
@Wutz sagte in Daten abfragen - scanf() macht Probleme:
Korrekt ist allein
if( 1==scanf("%29[^\n]",firstname) ) ...
„Günther Olaf von Wikingerstein“ gefällt das.
Das gibt zwar Probleme mit aufeinanderfolgenden Abfragen, aber die Lösung dazu wurde ja schon angesprochen.
-
Aber ihr könnt doch nicht wirklich das scanf für das Einlesen eines Strings ohne Längenangabe gut finden?! Und auch der Check auf Erfolg sollte doch immer dabei sein. Vielleicht ist es also keine so schlechte Idee, sich mal zu fragen, warum @Wutz das so geschrieben hat.
-
@wob sagte in Daten abfragen - scanf() macht Probleme:
Aber ihr könnt doch nicht wirklich das scanf für das Einlesen eines Strings ohne Längenangabe gut finden?! Und auch der Check auf Erfolg sollte doch immer dabei sein. Vielleicht ist es also keine so schlechte Idee, sich mal zu fragen, warum @Wutz das so geschrieben hat.
Das war nicht der Unterschied, den ich meinte. Ich bezog mich auf das unterschiedliche Verhalten bei Whitespace, worüber man nachdenken sollte, was man genau will. Längenangaben können die Stringformatspezifizierer ja alle.
-
@Wutz sagte in Daten abfragen - scanf() macht Probleme:
@hustbaer sagte in Daten abfragen - scanf() macht Probleme:
OK. Du hast wohl Recht. In der Praxis macht es keinen Unterschied, aber streng genommen ist es vermutlich falsch.
char firstname[30]; scanf(" %s", &firstname);
Ist UB weil char** typinkompatibel zu char* ist (weil char* typinkompatibel zu char ist).
Hm. Ich wüsste nicht was das mit
char**
zu tun hat.&firstname
ist die Adresse des Arrays, die gleich der Adresse des ersten Elements des Arrays ist. In C++ wäre der Typchar(*)[30]
. In C kenne ich mich diesbezüglich zu wenig aus, daher habe ich "wohl"/"vermutlich" geschrieben. Scheint aber nicht wirklich anders zu sein:int main(void) { char arr[30]; char* p = &arr; }
mit GCC 12 als C kompiliert:
<source>:3:15: warning: initialization of 'char *' from incompatible pointer type 'char (*)[30]' [-Wincompatible-pointer-types] 3 | char* p = &arr; | ^
Also ja, es ist UB. Weil
char *
nicht mitchar (*)[30]
kompatibel ist.char**
wäre nur im Spiel wennfirstname
ein Parameter wäre.