Forum: PC-Programmierung scanf und Leerzeichen


von Peter K. (Gast)


Lesenswert?

Es geht jetzt nicht darum etwas anderes als scanf zu zu nutzen..

ICh werde noch wahnsinnig mit C
Schreibe ich folgendes, kann ich
Vorname:Timo Peter
Nachname: Meyer
eingeben und es geht
1
#include <stdio.h>
2
3
#define cls system("cls");
4
5
6
char a [1][1][25];
7
8
9
int main(){
10
    system("color 1E");
11
    cls
12
    printf("Vorname:");
13
     scanf("%[a-z, ,A-Z]s",a[0][0]);
14
    printf("Nachname:");
15
     scanf("%s",a[0][1]);
16
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
17
}


Schreibe ich aber, um z.B:
Vorname:Timo Ulrich
Nachname:Meyer Schmidt
eingeben zu können folgendes, kann ich nur die Vornamen eingeben und er 
springt dann sofort auf Wilkommen xyz
WIESO?!
1
#include <stdio.h>
2
3
#define cls system("cls");
4
5
6
char a [1][1][25];
7
8
9
int main(){
10
    system("color 1E");
11
    cls
12
    printf("Vorname:");
13
     scanf("%[a-z, ,A-Z]s",a[0][0]);
14
    printf("Nachname:");
15
     scanf("%[a-z, ,A-Z]s",a[0][1]);
16
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
17
}

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> Es geht jetzt nicht darum etwas anderes als scanf zu zu nutzen..

Wieso?
Wenn man einen Hammer hat, sieht alles wie ein Nagel aus.

von Peter K. (Gast)


Lesenswert?

weil ich es gerne damit hinbekommen möchte!! da ich es so in den Büchern 
habe und es nicht klappt, was sollen immer diese dämlichen 
Gegenfragen?!!

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> weil ich es gerne damit hinbekommen möchte

Weil du unbedingt auf den Buffer-overflows bestehen möchtest?

von Peter K. (Gast)


Lesenswert?

Vielleicht kann ja noch jemand was sinnvolles beitragen als nur dumm rum 
zu labern.
Das scanf nicht mehr aktuell emfohlen wird ist mir bekannt du Troll, ist 
aber nicht die Frage
Geh woanders trollen

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> Vielleicht kann ja noch jemand was sinnvolles beitragen als nur dumm rum
> zu labern.

Vielleicht bist du einfach auf dem falschen Weg.
Warum willst du das dann auf keinen Fall wissen?

> Das scanf nicht mehr aktuell emfohlen wird ist mir bekannt du Troll
> Geh woanders trollen

Ich habe ein tatsächliches Problem benannt.
Trollen würde ich das nicht nennen.

von Peter K. (Gast)


Lesenswert?

Der QuellKOT steht da oben, was daran falsch ist kannst Du dann 
erkennen..
Ich wüsste nicht, welche Fragen noch offen sind

von MaWin O. (mawin_original)


Lesenswert?

Peter K. schrieb:
> was daran falsch ist kannst Du dann erkennen..

Das habe ich bereits erkannt und mitgeteilt.

> Ich wüsste nicht, welche Fragen noch offen sind

Und warum fragst du dann?

von Peter K. (Gast)


Lesenswert?

na wenn Du es mit scanf nicht weißt, warum schreiben wir dann hier,??
Dann warte ich auf Antworten von jemanden der es weiß
Wie es vom Grundsatz geht, siehst Du übrigens oben m Beispiel, nur 
irgendwas ist noch nicht i.O.
Irgendwie muss es damals ja auch ohne gets gegangen sein

von MaWin O. (mawin_original)


Lesenswert?

Peter K. schrieb:
> na wenn Du es mit scanf nicht weiß, warum schreiben wir dann hier,??

Warum willst du denn unbedingt gefährliche Funktionen verwenden?

> nur irgendwas ist noch nicht i.O.

eben.
Dein Ansatz ist falsch.

> Irgendwie muss es damals ja auch ohne gets gegangen sein

Ach du meine Güte.

>BUGS
>       Never use gets().

von beo bachta (Gast)


Lesenswert?

Ich würde mal diese Zeile verdächtigen. Der Array-Index ist
gegenüber der Deklaration überschritten ....

Peter K. schrieb:
> a[0][1]

von Peter K. (Gast)


Lesenswert?

??
Es ist ein Feld und ich trage an Position [0][1] 25 mögliche Zeichen 
lang, was ein oder sehe ich das falsch?
Das Feld ist ja angelegt als
char a [1][1][25];

von ein lupenreiner Demokrat (Gast)


Lesenswert?

du brauchst auch keine drei Dimensionen.
1
char name[2][25];
2
scanf("%s", name[0]);

reicht schon.

von Peter K. (Gast)


Lesenswert?

ja das ist richtig, aber ich teste es derzeit mit 3.
Aber es ist mir bewusst, trotzdem danke

von ein lupenreiner Demokrat (Gast)


Lesenswert?

Peter K. schrieb:
> a[0][1]

das geht bei dieser Definition nicht (wie oben schon erwähnt).

Peter K. schrieb:
> char a [1][1][25];

du hast da nur a[0][0][0], a[0][0][1], a[0][0][2], a[0][0][3], ..., 
a[0][0][24].

von beo bachta (Gast)


Lesenswert?

Peter K. schrieb:
> Es ist ein Feld und ich trage an Position [0][1] 25 mögliche Zeichen
> lang, was ein oder sehe ich das falsch?

Position [1] ist die 1. Position (Zählweise 0, 1). Du hast
aber per Deklaration nur 1 Position erzeugt, und das ist
die nullte. Du überschreitest also deine eigenen gesetzten
Grenzen.

von Peter K. (Gast)


Lesenswert?

??
Pos1 [0][0]
Pos2 [0][1]
Pos3 [1][0]
Pos4 [1][1]

also 4 Positionen, alle jeweils 24/25 Zeichen lang, da char a[1][1][25] 
dachte ich?!#
Wenn ich stattdessen schreibe
char a[10][10][25]
ändert sich nichts, ist also  wie ich es erwarten würde

von ein lupenreiner Demokrat (Gast)


Lesenswert?

Wieviele Einträge hat dieses Array?
1
char arr[1];

arr[0] ist vorhanden - da ist alles in Ordnung.

wo kommt denn arr[1] her? Das wäre der zweite Eintrag. Warum bekommst du 
überhaupt keine Fehlermeldung bei deiner IDE?

von Peter K. (Gast)


Lesenswert?

ebenfalls stürzt er so ab
 scanf("%[a-z, ,A-Z]s",a[0][0][25]);
aber mit  &, also
scanf("%[a-z, ,A-Z]s",&a[0][0][25]);
nicht?!
ICh denke beim array braucht/darf man das & nicht mal verwenden?!
Ich verstehe das alles nicht
@ ein lupenreiner Demokrat (
?
Im GEgensatz zu PAcal beginnt bei C ein Array doch mit 0 und nicht bei 
1, oder nicht?!
Somit ist doch 0 ein Platz und 1 ebenfalls,

von beo bachta (Gast)


Lesenswert?

Peter K. schrieb:
> dachte ich?!#

Beratungsresistenz ist eine Zier, doch weiter kommt man
ohne ihr.

von Eckhard T. (etik)


Lesenswert?

Du hast da wohl ein grundlegendes Verständnisproblem. Ein Array der 
Größe [1] hat genau ein Element mit dem Index [0]. a[1][1][25] ist ein 
dreidimensionales Array mit 1x1x25 Elementen - also genau einem 
Character-Array mit 25 Zeichen.

von Peter K. (Gast)


Lesenswert?

Wieso kann ich dann aber auf diesen unterschiedliche Werte ablegen, mit 
rechnen und einzeln abfragen?!

Und wie gesagt, wenn ich die mit [10][10][25] dimensioniere, ändert sich 
nichts
1
#include <stdio.h>
2
3
#define cls system("cls");
4
5
6
char a [10][10][25];
7
8
9
int main(){
10
    system("color 1E");
11
    cls
12
    printf("Vorname:");
13
     scanf("%[a-z, ,A-Z]s",a[0][0][25]);
14
    printf("Nachname:");
15
     scanf("%[a-z, ,A-Z]s",&a[0][1][20]);
16
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
17
}
ändert wie gesagt, nichts.
In Free Pascal/Delphi Lazarus ist das irgendwie einfacher, dank String

von beo bachta (Gast)


Lesenswert?

Peter K. schrieb:
> scanf("%[a-z, ,A-Z]s",a[0][0][25]);

Du fängst mit dem 26. Element deines Arrays an zu schreiben
obwohl du nur 25 Elemente bereitgestellt hast!
Array Index zu gross!

von Peter K. (Gast)


Lesenswert?

hab ihr den code mal ausprobiert?
Auch mit 0 0 0 funktioniert es nicht, keine Veränderung

von Peter K. (Gast)


Lesenswert?

https://onlinegdb.com/9nEMEh7nt

Hier könnt ihr es testen

von ein lupenreiner Demokrat (Gast)


Lesenswert?

Peter K. schrieb:
> Auch mit 0 0 0 funktioniert es nicht

weil das kein Zeiger ist.

scanf() erwartet einen Zeiger.

mach es doch wie bei printf (mit zwei Dimensionen).

Wobei du zuerst mit einer Dimension anfangen solltest.
1
char vorname[25];
2
char nachname[25];
3
4
scanf("%s", vorname);
5
scanf("%s", nachname);

danach mit zwei Dimensionen:
1
char name[2][25];
2
scanf("%s", name[0]); //Vorname
3
scanf("%s", name[1]); //Nachname

von Peter K. (Gast)


Lesenswert?

ändert leider nichts, hatte ich alles schon durch.
Wie gesagt, einfach mal im onlinecompiler kurz testen

Das Problem ist ja ganz oben beschreiben.

Es tritt auf sobald es um 2 Nachnamen geht bzw 2 vor und Nachnamen mit 
Leerzeichen getrennt.

Deine Beispiele funktionieren logischerweise problemlos

von Rolf M. (rmagnus)


Lesenswert?

Peter K. schrieb:
> ??
> Es ist ein Feld und ich trage an Position [0][1] 25 mögliche Zeichen
> lang, was ein oder sehe ich das falsch?

Das ist ein Feld aus 1*1 Strings mit "je" 25 Zeichen, also genau einem 
String, mit Index [0][0]. Du versuchst aber nun, dort einen zweiten 
String einzutragen.

Peter K. schrieb:
> also 4 Positionen, alle jeweils 24/25 Zeichen lang

Nein. Wieso glaubst du, dass eine Längenangabe [1] zu einer Läge von 2 
führt? Bei der 25 ist dir ja offenbar bewusst, dass es nur zu einer 
Länge von 25 führt.

> Wenn ich stattdessen schreibe
> char a[10][10][25]
> ändert sich nichts, ist also  wie ich es erwarten würde

Das ist genauso falsch.

Peter K. schrieb:
> Wieso kann ich dann aber auf diesen unterschiedliche Werte ablegen, mit
> rechnen und einzeln abfragen?!

Weil C in der Regel keine Prüfung der Arraygrenzen vornimmt. Du 
überschreibst daher munter anderen Speicher. Es kann durchaus sein, dass 
es trotzdem zu funktionieren scheint, kann aber genauso gut zu sehr 
interessanten Effekten führen. Einige der schlimmsten Sicherheitslücken 
sind genau so entstanden.

Peter K. schrieb:
> In Free Pascal/Delphi Lazarus ist das irgendwie einfacher, dank String

Ja, Stringhandling ist nicht unbedingt die Stärke von C.

Peter K. schrieb:
> Im GEgensatz zu PAcal beginnt bei C ein Array doch mit 0 und nicht bei
> 1, oder nicht?!
> Somit ist doch 0 ein Platz und 1 ebenfalls,

Nein, wenn es eine Größe von 1 hat, gibt es genau einen Platz. Dass der 
Index bei 0 anfängt, ändert daran nichts.

Peter K. schrieb:
> Es tritt auf sobald es um 2 Nachnamen geht bzw 2 vor und Nachnamen mit
> Leerzeichen getrennt.

Das liegt schlicht daran, dass %s bei scanf so definiert ist, dass es 
beim ersten Leerzeichen aufhört.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> Das Problem ist ja ganz oben beschreiben.

Du könntest deine ganzen Bufferoverflows ja mal beheben.
Ein Teil davon ist auch scanf nicht zu nutzen.

Bufferoverflows führen in C zu sog. Undefined Behavior. Das führt, wie 
der Name schon sagt, zu undefiniertem Verhalten.

Aber anscheinend pöbelst du lieber herum.

von Peter K. (Gast)


Lesenswert?

Habe eben die Lösung aus einem vernünftigen! Forum erhalten..
Es geht hierbei nicht um Sinnvoll oder nicht, es geht darum zu verstehen 
was passiert.
Jemand der nicht mal das(eine Anfängerübung) hinbekommt, hat C ganz 
offenbar nicht in Gänze verstanden.
So ein C Anwender will ich nicht sein, dann bleibe ich lieber bei einer 
Programmiersprache die ich weites gehend beherrsche.

Diese lautet
1
#include <stdio.h>
2
3
4
5
6
char a [2][2][25];
7
8
9
int main(){
10
11
    printf("Vorname:");
12
     scanf(" %[ a-zA-Z-]",a[0][0]);
13
    printf("Nachname:");
14
     scanf(" %[ a-zA-Z-]",a[0][1]);
15
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
16
}

Der Formatspecifier für das Set ist nur [ und nicht s mit 
vorangestelltem [].
Wenn Zeichen nicht zu einem Formatspecifiere gehören, müssen sie im 
Eingabestrom vorhanden sein. (Whitespace stehen für beliebig viele und 
jede Art von Whitespace)

Und %[ ist auch kein regulärer Ausdruck, sondern eine sture Angabe der 
Zeichen. Besondere Zeichen sind lediglich ^ und -. Das Komma kann bei 
dir Bestandteil des Namens sein und ist eher weniger sinnvoll. Ein - 
dagegen kann bei Doppelnamen vorkommen.

Nach dem Vornahmen steht noch das \n im Eingabestrom. Das kann man mit 
einem Whitespace im Formatstring überlesen (außer %c und %[ machen das 
sonst alle Formatspecifier automatisch)

Ein führendes Leerzeichen vor dem %[ (hier direkt hinter dem ") kann 
helfen.

von Rolf M. (rmagnus)


Lesenswert?

Peter K. schrieb:
> Es geht hierbei nicht um Sinnvoll oder nicht, es geht darum zu verstehen
> was passiert.

Wir haben versucht, dir das verständlich zu machen, aber du wolltest es 
nicht hören.

> Jemand der das nicht hinbekommt, hat C ganz offenbar nicht in gänze
> verstanden

Das sagst gerade du, der schon an der korrekten Größendefinition von 
Arrays scheitert…

von Peter K. (Gast)


Lesenswert?

Rolf M. schrieb:
> Das sagst gerade du, der schon an der korrekten Größendefinition von
> Arrays scheitert…

Äh, ich bin Anfgänger. MErkst Du noch was LOL
ICH darf solche Fehler machen, muss sie sogar machen.
Aber das was ihr hier abgeliefert habt war einfach nur traurig.#Die 
Lösung hatte keiner, aber viel Rumgelaber, wie immer

In einem anderen Forum braucht es 5 Beiträge zur Lösung nachts...

Was habt ihr denn versucht verständlich zu machen?!
Das falsche array ist nicht das eigentliche PRoblem gewesen, das hast Du 
aber verstanden, oder?
Das war falsch, aber nicht der Grund für die fehlerhafte Funktion..
Und "Scanf  ist kacke, mach es andere" ist keine Hilfe...und sogar 
falsch, da die Fragestellung anders lautete...

von Peter K. (Gast)


Lesenswert?

Rolf M. schrieb:
> Das liegt schlicht daran, dass %s bei scanf so definiert ist, dass es
> beim ersten Leerzeichen aufhört.

Und genau das ging es hier zu umgehen, und klappt mit dem nun gezeigten 
COde.
Ich hatte gerade gesehen, Du hast durchaus sogar was sinnvolles zum 
Thema beigetragen, danke dafür, aber es war nicht des Rätsels Lösung.

Und wieso meinst Du
"> Wenn ich stattdessen schreibe
> char a[10][10][25]
> ändert sich nichts, ist also  wie ich es erwarten würde

Das ist genauso falsch."

?! Das ist doch richtig, ich habe e jetzt auch [2] [2] [25] geändert, 
das
sollte doch so stimmen
2x2 Felder  je 25 Zeichen
***********************************************************************
Wie gesagt, die Lösung ist(Aber Dein Einwand mit den Feldern war absolut 
richtig)
scanf(" %...
Also das Leerzeichen VOR dem %, ich muss mich damit nachher noch mal 
etwas beschäftigen um das alles nachvollziehen zu können
***********************************************************************

Beitrag #7246231 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Lesenswert?

Peter K. schrieb:
> Äh, ich bin Anfgänger. MErkst Du noch was LOL
> ICH darf solche Fehler machen, muss sie sogar machen.
> Aber das was ihr hier abgeliefert habt war einfach nur traurig.

Du tust gerade so, als würdest du hier für einen Dienst bezahlen, der 
dann nicht erbracht wird. Du hast erst mal keinen Anspruch auf eine 
Antwort, die genau deinen Wünschen entspricht. Daher kannst du nicht 
einfach hier was verlangen.

> Was habt ihr denn versucht verständlich zu machen?!

Wie Arrays funktionieren, denn da hapert es wohl schon. Die Augen davor 
zu verschließen, nur weil du jetzt halt "scanf" machst, bringt doch auch 
nichts. Entweder lernst du halt den Umgang mit Arrays, oder du benutzt 
sie erst mal nicht, bis du sie verstanden hast.

> Das falsche array ist nicht das eigentliche PRoblem gewesen, das hast Du
> aber verstanden, oder?

Aha, du willst also, dass man grobe Fehler im Programm ignoriert, weil 
du danach nicht explizit gefragt hast. Ich finde es durchaus sinnvoll, 
auf Fehler hingewiesen zu werden, die man noch gar nicht erkannt hat.

> Und "Scanf  ist kacke, mach es andere" ist keine Hilfe...und sogar
> falsch, da die Fragestellung anders lautete...

Das ist eben, als ob du fragst, wie man mit Benzin eine Zigarette 
ausmacht. Kann man schon machen, aber sinnvoll ist es nicht.

Peter K. schrieb:
> Und wieso meinst Du
> "> Wenn ich stattdessen schreibe
>> char a[10][10][25]
>> ändert sich nichts, ist also  wie ich es erwarten würde
>
> Das ist genauso falsch."
>
> ?! Das ist doch richtig

Ja, mein Fehler. Ich hatte das falsch verstanden. Ich hatte es gelesen 
als Zugriff auf Element [10][10] statt als Definition eines 
10x10-Arrays.

: Bearbeitet durch User
von Peter K. (Gast)


Lesenswert?

Rolf M. schrieb:
> Ja, mein Fehler. Ich hatte das falsch verstanden. Ich hatte es gelesen
> als Zugriff auf Element [10][10] statt als Definition eines
> 10x10-Arrays.

Siehst Du, wir machen alle Fehler, ist halt normal und bei einem 
Anfägner wie mir auch nicht weiter erwähnenswert:-).
Und nein, ich lasse Arrays nicht bleiben, denn mit denen beschäftige ich 
mich gerade jetzt und dadurch bin ich auf diese "Besonderheit mit dem " 
%.." gestoßen
Und man sieht ja hier an diesmem Threat, dass das offenbar ganz viele 
nicht ussten.
Somit ein Win Win für alle.
Of man scanf benutzt oder nicht hat damit ja nichts zu tun, sondern mit 
dem Anwenden der C Syntax

von Norbert (Gast)


Lesenswert?

Peter K. schrieb:
> Of man scanf benutzt oder nicht hat damit ja nichts zu tun, sondern mit
> dem Anwenden der C Syntax

Schon, aber wenn man einen Puffer char[10] hat
und man will unbedingt scanf nutzen,
dann sollte man zumindest ein scanf("%9s", …) machen.
Alles andere ist gefährliches Geprutsche!
Sicherlich nicht jetzt beim Test,
aber schlechte Angewohnheiten brennen sich viel zu schnell ein.

von Udo S. (urschmitt)


Lesenswert?

Peter K. schrieb:
> Äh, ich bin Anfgänger. MErkst Du noch was LOL
> ICH darf solche Fehler machen, muss sie sogar machen.

Völlig korrekt

Peter K. schrieb:
> In einem anderen Forum braucht es 5 Beiträge zur Lösung nachts...

Prima, aber hier hast du nach 20 Beiträgen immer noch nicht einsehen 
wollen, dass man bei einem Array das aus einem Element besteht, nicht 
auf das Zweite zugreifen darf.
Und sorry, wenn ich ein massiven Buffer overflow Fehler sehe, dann suche 
ich nicht weiter bevor der behoben ist.

Peter K. schrieb:
> Das war falsch, aber nicht der Grund für die fehlerhafte Funktion..
> Und "Scanf  ist kacke, mach es andere" ist keine Hilfe...und sogar
> falsch, da die Fragestellung anders lautete...

Den Fehler in scanf hätte ich nicht gefunden. Ich habe scanf bzw sscanf 
vor über 30 Jahren ein paarmal benutzt und war von der Funktionalität so 
begeistert, dass ich seitdem von der Konsole nur noch Strings lese und 
die selbst auswerte.
Wobei ich in den letzten 15 Jahren C nur noch gelegentlich mache.

Dass der Thread hier so eskaliert ist lag meiner Meinung nach schon an 
beiden Seiten. Wobei hier in diesem Forum auch klar ist dass es oft 
ruppig zugeht, man aber auch sehr kompetente Hilfe bekommen kann wenn 
man seinen Thread umsichtig moderiert.

von Tzzz (Gast)


Lesenswert?

Schreib lieber: scanf("%[^\n]",string);
So klappen auch Umlaute und es gibt keine Probleme mit dem Dash (-).

von Dirk B. (dirkb2)


Lesenswert?

Tzzz schrieb:
> So klappen auch Umlaute und es gibt keine Probleme mit dem Dash (-).

Der Dash wird, da er am Ende des Sets steht, richtig behandelt.

Bei Windows sind auch Umlaute in der Konsole schwierig, weil der Editor 
eine andere Codepage als die Konsole hat.

Namen (international) sind schwierig.
Benutzerführung bei Konsoloenprogrammen auch.

Wo das hin führt sieht man ja am
1
system("color 1E");
Bevor man am Design pfuscht, sollte die Funktion stehen.

von Ludwig (Gast)


Lesenswert?

Dirk B. schrieb:
> Bei Windows sind auch Umlaute in der Konsole schwierig, weil der Editor
> eine andere Codepage als die Konsole hat.

SetConsoleOutputCP/SetConsoleInputCP lösen das Problem.

> Benutzerführung bei Konsoloenprogrammen auch.

Unter halbwegs aktuellem Windows kennt die Konsole 
VT100-Terminalsequenzen.

Die aktiviert man mit SetConsoleMode und dem Flag 
ENABLE_VIRTUAL_TERMINAL_PROCESSING

von Εrnst B. (ernst)


Lesenswert?

Ludwig schrieb:
> Unter halbwegs aktuellem Windows kennt die Konsole
> VT100-Terminalsequenzen.

Funktioniert da auch "<TAB><BACKSPACE><BACKSPACE><BACKSPACE>..." wie es 
soll, oder haben die das inkompatibel mit Windows NT/2000/XP gemacht?

von Morpheus (Gast)


Lesenswert?

Peter K. schrieb:
> Die
> Lösung hatte keiner, aber viel Rumgelaber, wie immer

Wohl weil sich jeder folgendes denkt:
Warum hat der Typ so eine lange Frage verfasst und nicht einfach "scanf 
Leerzeichen" in google eingegeben?

von Peter K. (Gast)


Lesenswert?

Dirk B. schrieb:
> Tzzz schrieb:
>
> Wo das hin führt sieht man ja am
1
system("color 1E");
> Bevor man am Design pfuscht, sollte die Funktion stehen.
#

#Wie gesagt, war das nur ein Test.
Ich mag solche Systemufrufe absolut nicht und habe es wenn immer möglich 
auch in Pascal vermieden

Tzzz schrieb:
> Schreib lieber: scanf("%[^\n]",string);
> So klappen auch Umlaute und es gibt keine Probleme mit dem Dash (-).

Wobei es nicht funktionieren würde, Du hast den selben Fehler gemacht 
wie ich, teste es mal.

Morpheus schrieb:
> Peter K. schrieb:
>> Die
>> Lösung hatte keiner, aber viel Rumgelaber, wie immer
>
> Wohl weil sich jeder folgendes denkt:
> Warum hat der Typ so eine lange Frage verfasst und nicht einfach "scanf
> Leerzeichen" in google eingegeben?

ne ist klar, deshalb verplempern die lieber ihre Zeit falsche Hinweise 
zu geben und teils dumme Kommentare zu hinterlassen?
Dann müssten einige hier aber ein eeecht langweiliges Leben haben
Ähm, nein, ich denke nicht, aber wenigsten kann man dann dazu stehen das 
man es nicht wusste, wie es ja auch einer mit Arsch in der Hose gemacht 
hat.
C ist so nervig komplex, das selbst so einfache Dinge durchrutschen 
können, obwohl man schon lange damit arbeitet.
MAn darf nicht vergessen, das war eine absolute Anfängerübung, daher 
kann man bei den anderen die hier auf dicke Hose gemacht haben eher von 
totaler Selbstüberschätzung ausgehen.

Und wenn ich ein Problem mit scanf nicht gelöst bekomme, wie es die 
Aufgabe aber vorsieht, könntest Du im Unterricht oder in einer Firma, 
auch nicht einfach getc oder sonstwas verwenden und würde nur zeigen das 
man die Aufgabe nicht gelöst bekommen hat

Und ja, ich hatte die stringlänge bei scanf begränzt, wie gesagt, war 
das der Versuchscode, da es nie geklappt hat, und ich nach und nach 
Parameter reduziert hatte die nichts mit dem Problem zu tun haben 
konnten

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> deshalb verplempern die lieber ihre Zeit falsche Hinweise
> zu geben

Die Hinweise waren ganz und gar nicht falsch.

Du hast mit deinem Programm Undefined Behavior erzeugt. Wenn ein 
Programm Undefined Behavior auslöst, dann ist der weitere Programmablauf 
undefiniert.
Ein C-Programmierer weiß, dass es sinnlos ist weiter zu debuggen, wenn 
man Undefined Behavior im Programm hat.

Und genau deshalb hat hier jeder darauf gepocht diesen Fehler zuerst zu 
beheben.
Du hast hingegen nur mit Pöbeleien geantwortet.
Denk mal darüber nach.

von Peter K. (Gast)


Lesenswert?

MaWin gerade Du solltest Dir da an Deine Nase fassen..

"Und genau deshalb hat hier jeder darauf gepocht diesen Fehler zuerst zu
beheben."
Nanu, in welchem Film hängst Du denn fest?
Ich sagte das eure Lösungsvorschläge das Problem nicht beheben und euch 
sogar aufgefordert es doch einfach mal selber zu testen, ich hatte sogar 
den kompletten Code zur Verfügung gestellt damit es jedem freisteht es 
mal selber zu probieren, wo die Krux liegt.
Natürlich habe ich, hatte ich auch immer wieder erwähnt, die geänderten 
PAramter am Array ausprobiert und gesagt, Fehler ist immer noch da...


MaWin schrieb:
> Die Hinweise waren ganz und gar nicht falsch.

Nenn es wie Du willst, von mir aus Thema verfehlt.
Aber die Frage lautete wieso es mit der Eingabe von Freizeichen nicht 
ging.
Die gegebenen Antworten gingen am Thema vorbei, waren somit falsch auf 
das Problem bezogen.
In einem Test wäre man durchgefallen, egal ob Du auf die anderen Fehler 
hingewiesen hast, die Aufgabe wurde nicht gelöst

Frag bei C 10 Leute  und DU bekommst 10 Antworten und es bricht ein 
Streit aus was alles nicht gut ist, falsch ist etc pp.
Deshalb ist mir C so unsympathisch.
Bei C++ ist es wohl noch schlimmer, da werde ich mich fernhalten.

Wenn ich möglich werde ich weiterhin mit Free Pascal, Lazarus bzw Delphi 
bleiben.

Aber natürlich schaue ich mir auch immer wieder mal C.
Der Vorteil sind die Herstellereigenen Tools von Microchip z.B.

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> Aber die Frage lautete wieso es mit der Eingabe von Freizeichen nicht
> ging.
> Die gegebenen Antworten gingen am Thema vorbei, waren somit falsch auf
> das Problem bezogen.

Lies dir das mal durch:
https://en.wikipedia.org/wiki/Undefined_behavior

Du scheinst nicht die geringste Ahnung davon zu haben, was UB bedeutet.

> Frag bei C 10 Leute  und DU bekommst 10 Antworten und es bricht ein
> Streit aus was alles nicht gut ist, falsch ist etc pp.

Ich sehe hier genau einen der streitet und Vorschläge erst nicht annimmt 
und dann herumpöbelt.

von Peter K. (Gast)


Lesenswert?

Und Du verteidigst deinen Fehler imer noch, hast es also immer noch 
nicht verstanden.
Der thread wurde überhaupt erst so hitzig, weil Du von Anfang an am 
Thema vorbei geschrieben hast.
Dein UB HAT den Fehler nicht verursacht!!!!
Er kann alles mögliche verursachen, womöglich auch diesen Fehler, aber 
ich hatte dir gesagt, das es nicht das Problem ist, dennoch reitest Du 
die ganze Zeit darauf herum.
Stattdessen kommen laufend Gegenfragen die völlig fehl am Platz sind, 
weil das nicht die Fragestellung war.
Und Du merkst es immer noch nicht.
Also sinnlos weiter mit dir zu diskutieren. Ich wäre Dir aber zu Dank 
verpflichtet, wenn Du dich aus meinen Threads raushältst, da sie nur 
Unruhe bringen. Danke
Setzen, 6.

von Dirk B. (dirkb2)


Lesenswert?

Peter K. schrieb:
> Und wenn ich ein Problem mit scanf nicht gelöst bekomme, wie es die
> Aufgabe aber vorsieht, könntest Du im Unterricht oder in einer Firma,
> auch nicht einfach getc oder sonstwas verwenden und würde nur zeigen das
> man die Aufgabe nicht gelöst bekommen hat

Naja, das mit getc steht sogar in Lehrbüchern für C.
Das Leerzeichen im Formatstring hat halt nicht jeder auf dem Schirm.

von Norbert (Gast)


Lesenswert?

Dirk B. schrieb:
> Das Leerzeichen im Formatstring hat halt nicht jeder auf dem Schirm.

Muss man auch nicht:
1
man 3 scanf

SCNR

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> Dein UB HAT den Fehler nicht verursacht!!!!

Das habe ich auch nicht behauptet.

Aber es hat (neben deiner unausstehlichen Art) verursacht, dass sich 
niemand ernsthaft mit deinem Thema beschäftigt hat.
Und das ist auch völlig verständlich, weil sie es sehr wohl hätte 
verursachen können.
Erfahrene C-Entwickler, von denen du ja offensichtlich keiner bist, 
wissen das.
Und das solltest du zur Kenntnis nehmen.
Und zwar ohne wieder einmal ausfallend zu werden.
Ok?

> Also sinnlos weiter mit dir zu diskutieren.

Warum tust du es trotzdem?

> Ich wäre Dir aber zu Dank
> verpflichtet, wenn Du dich aus meinen Threads raushältst

Auf deinen Dank verzichte ich gerne, wenn ich weiterhin frei entscheiden 
darf, wem ich mit meinen Antworten helfe.

von KArl Fred M. (Gast)


Lesenswert?

Dirk B. schrieb:
> Das Leerzeichen im Formatstring hat halt nicht jeder auf dem Schirm.

Na, aber das ist ja grade das interessante:-)
Es ist ja jetzt nicht speziell nur eine Besonderheit von scanff, sondern 
zeigt ob man Stringverarbeitung in C verstanden hat.
Es geht ja lediglich darum zu verstehen, was ein Eingangspuffer ist, 
wann dort noch überschüssige Zeichen drinliegen und wie man mit diesen 
Umgeht.
Der gleiche Fehler könnte auch später ohne scanf an anderer Stelle 
auftreten, wenn man das nicht berücksichtig.
Es ist also tatsächlich eher eine prinzipielle Verständnisfrage, ob man 
Strings verstanden hat.
Und deshalb fand ich diese Erkenntnis sehr lehrreich, für mich.

In meinem alten Lehrbuch steht es noch mit stringf mit einem ähnlichen 
Beispiel, da klappt es ,a erb auch nur weil er nur EINE solche 
Doppelabfrage macht mit Lehrzeichen, ich hatte es dahingehen mit 2 
geändert und BUMMS, passt es nämlich nicht mehr.

Und DAS sind doch die Dinge, aus denen man dann lernt

von KArl Fred M. (Gast)


Lesenswert?

MaWin schrieb:
> Auf deinen Dank verzichte ich gerne, wenn ich weiterhin frei entscheiden
> darf, wem ich mit meinen Antworten helfe.

Kannst du natürlich frei entscheiden, aber es handelt sich um eine 
Bitte.
Also BITTE!!! lass es einfach.
Wäre voll lieb von Dir.
Danke

von KArl Fred M. (Gast)


Lesenswert?

Norbert schrieb:
> Dirk B. schrieb:
>> Das Leerzeichen im Formatstring hat halt nicht jeder auf dem Schirm.
>
> Muss man auch nicht:man 3 scanf
>
> SCNR

Hatte ich tatsächlich auch versucht, hatte aber irgendwie auch nicht so 
richtig funktioniert, erstaunlicherweise, aber womöglich hatte ich da 
was anderes bei den Parametern falsch.
Aber den Eingangspuffer hatte ich zwischendurch schon im Verdacht und 
hatte dann tatsächlich 3 Zeilen oder so Scanf(); eingelesen

von MaWin (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Kannst du natürlich frei entscheiden

Sehr großzügig von dir.
Danke.

> Also BITTE!!! lass es einfach.

Was ist denn mit deiner Tastatur los. Sie ist offenbar defekt.
Da solltest du einmal nach schauen.

von KArl Fred M. (Gast)


Lesenswert?

Siehst Du MaWin, deshalb wollte nie jemand mi Dir spielen..
Daraus werden dann Programmierer, allein vor dem PC

Zurück zum Thema:-)
Anbei noch mal der Versuch mit Scanf den Puffer zu leeren
Zumindest so, klappt es nicht, aber ich muss mich da wie gesagt noch 
etwas mit beschäftigen.
[code]

char a [2][2][25];
int main(){
    printf("Vorname:");
     scanf(" %[a-z, ,A-Z]s",a[0][0]);
     scanf("");
    printf("Nachname:");
         scanf("%s",a[0][1]);
    scanf("");
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
}

von MaWin (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Siehst Du MaWin, deshalb wollte nie jemand mi Dir spielen..
> Daraus werden dann Programmierer, allein vor dem PC

Geteiltes Leid ist halbes Leid.

> Zumindest so, klappt es nicht, aber ich muss mich da wie gesagt noche
> twas mit beschäfitgen.

Du hast aber schon mitbekommen, dass das Problem gelöst ist?

von Norbert (Gast)


Lesenswert?

Braucht ein
1
"%[ a-zA-Z0-9]9s"
 für eine neun Zeichen lange Eingabe inkl. Leerzeichen.

von KArl Fred M. (Gast)


Lesenswert?

MaWin schrieb:
>> Zumindest so, klappt es nicht, aber ich muss mich da wie gesagt noche
>> twas mit beschäfitgen.
>
> Du hast aber schon mitbekommen, dass das Problem gelöst ist?

Alter, geh raus, in den Sandkasten.
Was hier abläuft nennt sich Konversation. Sowas kennt man nicht, wenn 
man den ganzen Tag ohne Freunde vor dem PC sitzt, wie Du.

Es hat noch jemand den Vorschlaf mit 3x scanf gemacht.
Offenbar ist dir das auch entgangen, wenn Du deinen Kot genauso 
validierst, Porst Mahlzeit.

von KArl Fred M. (Gast)


Lesenswert?

Norbert schrieb:
> für eine neun Zeichen lange Eingabe inkl. Leerzeichen.

Nein, das ist genau der Fehler gewesen.
Du bist jetzt auch hineingetappt:-)
Versuch es mal hier
Musst nur Deine Änderung noch eintragen

https://www.onlinegdb.com/online_c_compiler

#include <stdio.h>
char a [1][1][25];
int main(){
    printf("Vorname:");
     scanf("%[a-z, ,A-Z]s",a[0][0]);
    printf("Nachname:");
     scanf("%s",a[0][1]);
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
}

von Yalu X. (yalu) (Moderator)


Lesenswert?

scanf ist etwas speziell, was die Behandlung von Whitespace (sowohl in
der Eingabe als auch im Formatstring betrifft). Insbesondere wird
normalerweise nicht zwischen Space (' '), Newline ('\n'), Tab ('\t')
usw. unterschieden. Das ist ganz praktisch, wenn man bspw. eine Liste
von Zahlenwerten einlesen will, die mit einer variablen Anzahl von
Spaces, Newlines oder Tabs voneinander getrennt sind. Es erschwert
allerdings das Vorgehen, wenn man wie der TE eine Sequenz beliebiger
Zeichen bis zum Zeilenende einlesen möchte. Dafür verwendet man besser
fgets.

Will man dennoch scanf dafür vergewaltigen, weil es der Lehrer so
möchte, kann man das folgendermaßen tun:
1
  char s[100];
2
  scanf("%[^\n]%*c", s);

Das entspricht dem Vorschlag von Tzzz mit dem Unterschied, dass am Ende
mit %*c noch ein weiteres Zeichen, nämlich das Newline gelesen wird, das
sonst den nächsten scanf-Aufruf stören würde.

Um einen Buffer-Overflow zu vermeiden, kann man im Formatelement eine
Feldlänge (Array-Größe minus 1, wegen der Zero-Termination) angeben,
Wodurch überlange Eingaben abgeschnitten werden. Damit die restlichen
Zeichen in der Zeile nicht das nachfolgende scanf stören, müssen diese
überlesen werden, ohne sie in eine Variable zu schreiben. Damit auch
leere Eingabezeilen korrekt verarbeitet werden, sollte die Variable vor
dem Aufruf von scanf als Leerstring initialisiert werden.

Das alles ist im folgenden Beispiel umgesetzt:
1
  char s[100];
2
  s[0] = '\0';
3
  scanf("%99[^\n]%*[^\n]", s);
4
  scanf("%*c");

Das Lesen des abschließenden Newlines mit %*c erfolgt hier in einem
separaten scanf, weil im ersten scanf bei einer Eingabelänge ≤ 99 das
Formatelement %*[^\n] mangels weiterer Eingabezeichen fehlschlägt und
damit ein %*c am Ende gar nicht ausgeführt würde.

Um das Ganze besser zu verstehen, empfiehlt es sich, die Dokumentation
von scanf im Detail durchzulesen.

von KArl Fred M. (Gast)


Lesenswert?

Ja, das scheint zu funktionieren ohne seperatem Scanf
1
#include <stdio.h>
2
3
char a [2][2][25];
4
int main(){
5
6
    printf("Vorname:");
7
     scanf("%[^\n]%*c",a[0][0]);
8
    printf("Nachname:");
9
     scanf("%[^\n]%*c", a[0][1]);
10
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
11
}

von KArl Fred M. (Gast)


Lesenswert?

Wozu dient
s[0] = '\0';??

Ich hätte s[100] = '\0';
verstanden, aber warum an Postion =?
Vermutlich ist es egal ob es an 0 oder 100 steht? Aber macht an 0 Sinn?

von KArl Fred M. (Gast)


Lesenswert?

Norbert schrieb:
> "%[ a-zA-Z0-9]9s"

Ach ja und im C Forum wurde ich explizit darauf hingewiesen das hier das
]9s"

s, falls ist und dort nicht mehr gesetzt werden darf, da Du wohl schon 
die gültigen Zeichen definiert hast, oder so, war die Erklärung

von MaWin (Gast)


Lesenswert?

Yalu X. schrieb:
> Dafür verwendet man besser fgets.

Oh nein! Ein weiterer Hater, der den Threadteilnehmern bessere 
Alternativen vorschlägt.

Bist du etwa genau so ein krimineller Verbrecher wie ich?

KArl Fred M. schrieb:
> Wozu dient
> s[0] = '\0';??

Es stellt sicher, dass der string terminiert ist, auch wenn nichts 
weiter hineingeschrieben wird.

von Yalu X. (yalu) (Moderator)


Lesenswert?

KArl Fred M. schrieb:
> Wozu dient
> s[0] = '\0';??

Damit wird s als Leerstring initialisiert, äquivalent zu
1
  strcpy(s, "");

Lässt man das weg, bleibt s bei der Eingabe einer Leerzeile
uninitialisiert bzw. enthält noch den Inhalt von der letzten Benutzung.
So wird aber aus einer leeren Eingabe ein Leerstring, also genau das,
was man erwarten würde.

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Nein, das ist genau der Fehler gewesen.
> Du bist jetzt auch hineingetappt:-)

Aha, ist das so?
1
#include <stdio.h>
2
// g++ -Wall -Wextra -pedantic -o "x" "x.cpp"
3
int main(void) {
4
    char in[100];
5
    scanf("%[ a-zA-z0-9]s", in);
6
    printf(">>>%s<<<\n", in);
7
    return  0;
8
}
9
10
$ ./x
11
qqq qqq qqq qqq qqq
12
>>>qqq qqq qqq qqq qqq<<<

Hmmmm … Es scheint mindestens ein System zu geben auf dem es 
funktioniert (Genau so wie in den man pages beschrieben)

[      Matches a nonempty sequence of characters from the specified set 
of accepted characters; the next pointer must be  a  pointer  to char, 
and  there  must be enough room for all the characters in the string, 
plus a terminating null byte.   The  usual  skip  of leading  white 
space is suppressed.

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Ach ja und im C Forum wurde ich explizit darauf hingewiesen das hier das
> ]9s"
>
> s, falls ist und dort nicht mehr gesetzt werden darf, da Du wohl schon
> die gültigen Zeichen definiert hast, oder so, war die Erklärung
Typo meinerseits, falsche Aussage von deren Seite!
1
#include <stdio.h>
2
// g++ -Wall -Wextra -pedantic -o "x" "x.cpp"
3
int main(void) {
4
    char in[10+1];
5
    scanf("%10[ a-zA-z0-9]", in);
6
    printf(">>>%s<<<\n", in);
7
    return  0;
8
}
9
$ ./x
10
a a a a a a a a a a a a a
11
>>>a a a a a <<<
Im Zweifelsfall nicht auf's Forum hören sondern die Doku lesen. ;-)

von KArl Fred M. (Gast)


Lesenswert?

Also hier funktioniert es so nicht, oder habe ich mich vertippt?
https://onlinegdb.com/29assJRrn
1
#include <stdio.h>
2
3
char a [2][2][25];
4
int main(){
5
6
    printf("Vorname:");
7
    scanf("%[ a-zA-z0-9]s",a[0][0]);
8
    printf("Nachname:");
9
    scanf("%[ a-zA-z0-9]s",a[0][1]);
10
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
11
}

von KArl Fred M. (Gast)


Lesenswert?

@Norbert
ach nein, jetzt sehe ich Deinen Fehler.
Wie gesagt, so steht es auch in meinem Buch und das geht
Aber eben nicht wenn Du Doppelte vor und Zunamen hast.


Wie gesagt, gleiche Falle

änderst Du Dein Beispiel in
1
#include <stdio.h>
2
3
char a [2][2][25+1];
4
int main(){
5
6
    printf("Vorname:");
7
    scanf(" %[ a-zA-z0-9]",a[0][0]);
8
    printf("Nachname:");
9
    scanf(" %[ a-zA-z0-9]",a[0][1]);
10
    printf("Willkommen, %s %s",a[0][0], a[0][1]);
11
}

dann geht es, wie gesagt

von MaWin (Gast)


Lesenswert?

KArl Fred M. schrieb:
> char a [2][2][25+1];

Zur Sicherheit würde ich 25+2 nehmen. Man weiß ja nie.

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Also hier funktioniert es so nicht, oder habe ich mich vertippt?
> https://onlinegdb.com/29assJRrn
> #include <stdio.h>
> char a [2][2][25];
> int main(){
>     printf("Vorname:");
>     scanf("%[ a-zA-z0-9]s",a[0][0]);
>     printf("Nachname:");
>     scanf("%[ a-zA-z0-9]s",a[0][1]);
>     printf("Willkommen, %s %s",a[0][0], a[0][1]);
> }

Tja, du nimmst 'ne Webseite, ich nehme einen Compiler. Wem wollen wir 
nun glauben?
Aber Spaß beiseite, vielleicht mal auf dem eigenen System übersetzen und 
sehen was passiert. Zumindest meine Linux Systeme sind sich ziemlich 
einig das es geht.
Das ›s‹ hinter den ›]‹ ist nicht nötig, aber eine Längenbegrenzung wäre 
erstrebenswert: ›%24[…]‹

von KArl Fred M. (Gast)


Lesenswert?

MAwin Du schnallst es nicht, oder?!

Du machst dich hier echt nur zum Löffel

von KArl Fred M. (Gast)


Lesenswert?

TEste es mal auf dem Onlinecompiler,
nicht das wir aneinander vorbei reden

von Yalu X. (yalu) (Moderator)


Lesenswert?

Norbert schrieb:
> Tja, du nimmst 'ne Webseite, ich nehme einen Compiler. Wem wollen wir
> nun glauben?

Deine scanf-Anweisung funktioniert beim ersten Aufruf perfekt, aber
nicht beim zweiten, wenn du die Anweisung zweimal hintereinander
ausführst.

Weil es vielleicht noch nicht jedem klar ist:

%s überliest führenden Whitspace (zu dem auch Newlines gehören), dafür
kann der eingegebene String selber keine Leerzeichen enthalten.

%[…] überliest führenden Whitspace nicht, dafür kann der eingegebene
String alle Zeichen enthalten, die zwischen den eckigen Klammern
angegeben sind (ggf. auch Leerzeichen).

: Bearbeitet durch Moderator
von MaWin (Gast)


Lesenswert?

KArl Fred M. schrieb:
> MAwin Du schnallst es nicht, oder?!

Tatsächlich. Ich verstehe nicht, warum du jetzt auf einmal 25+1 statt 25 
nimmst.
Warum nicht 25+2?
Willst du es mir erklären?

Norbert schrieb:
> aber eine Längenbegrenzung wäre erstrebenswert: ›%24[…]‹

Jetzt wird es aber wirklich abgehoben!

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> TEste es mal auf dem Onlinecompiler,
> nicht das wir aneinander vorbei reden

Ist für mich nicht noch nicht einmal ansatzweise relevant. Ich habe 
einen richtigen Compiler hier.

von KArl Fred M. (Gast)


Lesenswert?

So wie Du es jetzt beschreibt, müsste aber
scanf("%[ a-zA-z0-9]s",a[0][1]); oder
scanf("%s[ a-zA-z0-9]s",a[0][1]);

Dann ja funktionieren?
Oder meinst Du jetzt was anderes?

von Norbert (Gast)


Lesenswert?

MaWin schrieb:
> KArl Fred M. schrieb:
>> MAwin Du schnallst es nicht, oder?!
>
> Tatsächlich. Ich verstehe nicht, warum du jetzt auf einmal 25+1 statt 25
> nimmst.
> Warum nicht 25+2?
> Willst du es mir erklären?
>
> Norbert schrieb:
>> aber eine Längenbegrenzung wäre erstrebenswert: ›%24[…]‹
>
> Jetzt wird es aber wirklich abgehoben!

Verhindert einen Buffer Overflow! Wenn das für dich zu abgehoben ist…
Tja dann erstelle bitte keine Software… ;-)

von KArl Fred M. (Gast)


Lesenswert?

Norbert schrieb:
> Ist für mich nicht noch nicht einmal ansatzweise relevant. Ich habe
> einen richtigen Compiler hier.


Ja, aber wie gesagt, ist es falsch, auch bei deinem wird es nicht 
gehen....
Ich habe auch 3 richtige hier und auf KEINEM gehts..mit Deinem Beispiel.
Erklärung siehe weiter oben

Dev C, Codeblocks und noch so'n Dingen

von MaWin (Gast)


Lesenswert?

Norbert schrieb:
> Verhindert einen Buffer Overflow! Wenn das für dich zu abgehoben ist…
> Tja dann erstelle bitte keine Software… ;-)

UB zu verhindern ist hier nicht erwünscht!
UB ignorieren und pöbeln ist hier die Devise!

von Dirk B. (dirkb2)


Lesenswert?

KArl Fred M. schrieb:
> So wie Du es jetzt beschreibt, müsste aber
> scanf("%[ a-zA-z0-9]s",a[0][1]); oder
> scanf("%s[ a-zA-z0-9]s",a[0][1]);
>
> Dann ja funktionieren?
> Oder meinst Du jetzt was anderes?

Der Formatspecifier %[ hat mit dem Specifier %s nichts zu tun.
Warum sind die s noch da?

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> So wie Du es jetzt beschreibt, müsste aber
> scanf("%[ a-zA-z0-9]s",a[0][1]); oder

Das ›s‹ ist zuviel.

> scanf("%s[ a-zA-z0-9]s",a[0][1]);

Mit %s ist das Ding abgeschlossen, der verbleibende Teil ist Restmüll 
wenn auch Recycle-bar.
1
% ›LÄNGE‹ [›ERLAUBTE WERTE‹] # als spezifizierter String
2
% ›LÄNGE‹ s                  # als String exklusive whitespace

von Dirk B. (dirkb2)


Lesenswert?

Yalu X. schrieb:
> Das entspricht dem Vorschlag von Tzzz mit dem Unterschied, dass am Ende
> mit %*c noch ein weiteres Zeichen, nämlich das Newline gelesen wird, das
> sonst den nächsten scanf-Aufruf stören würde.

Das Newline kann man beim nächsten Aufruf von scanf überlesen, indem man 
ein Leerzeichen (oder anderes Whitespace) als erstes in dem Formatstring 
baut.

scanf(" %[^\n]", v);
scanf(" %[^\n]", n);

Es sei denn, man möchte Whitespace am Anfang vom String haben (was bei 
einem Namen eher störend ist)

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Ja, aber wie gesagt, ist es falsch, auch bei deinem wird es nicht
> gehen....
> Ich habe auch 3 richtige hier und auf KEINEM gehts..mit Deinem Beispiel.
> Erklärung siehe weiter oben
>
> Dev C, Codeblocks und noch so'n Dingen

OK, dann ist es jetzt ernsthaft an der Zeit an dir zu zweifeln.
g++ - wie von mir um 20:14 geschrieben - macht es tadellos.

Dev C ist ein Compiler?
Codeblocks ist ein Compiler?
›noch so'n Dingen‹ ist ein Compiler?

Das ist schon ein wenig Besorgnis erregend…

von Dirk B. (dirkb2)


Lesenswert?

Norbert schrieb:
> Das ›s‹ hinter den ›]‹ ist nicht nötig, aber eine Längenbegrenzung wäre
> erstrebenswert: ›%24[…]‹

Da nimmt man besser scanf_s, da man dort die Stringlänge variabel 
angeben kann

Ändert aber erstmal nichts an dem Formatspecifierproblem vom TO (was ja 
gelöst ist).

von Zeno (Gast)


Lesenswert?

ein lupenreiner Demokrat schrieb:
> Warum bekommst du
> überhaupt keine Fehlermeldung bei deiner IDE?
Weil es trotzdem gültiger C-Code ist. Wie war das nochmal mit C und den 
Arraylängen?
Wenn überhaupt wird maximal eine Warning kommen. Selbst bei Pascal 
(Lazarus) kompiliert Quellcode der ganz offensichtlich Arraygrenzen 
überschreitet, allerdings kommt ne fette Warnung, daß der Arrayindex 
außerhalb des Bereiches ist.

von Norbert (Gast)


Lesenswert?

Dirk B. schrieb:
> Da nimmt man besser scanf_s, da man dort die Stringlänge variabel
> angeben kann

Erster Beitrag, erste Zeile:
> Es geht jetzt nicht darum etwas anderes als scanf zu zu nutzen..

;-)

von Zeno (Gast)


Lesenswert?

Peter K. schrieb:
> Somit ist doch 0 ein Platz und 1 ebenfalls,
Nein in der Deklaration legts Du ja im Gegensatz zu Pascal keinen 
Startindex fest, sondern lediglich die Arraylänge.
1
/* C */
2
integer a[5]; //legt ein Array mit 5 Elementen an, Zählung beginnt mit 0
3
4
/* Pascal */
5
a : array[0..4] of integer; //legt ein Array mit 5 Elementen an, Zählung beginnt mit 0
6
7
a : array[1..5] of integer; //legt ein Array mit 5 Elementen an, Zählung beginnt mit 1
8
9
a : array of integer; //legt ein dynamisches Array an, Zählung beginnt immer mit 0

von KArl Fred M. (Gast)


Lesenswert?

@Dirk B
Danke, die Lösung hatte ich bereits mit Quellcode Beispiel genannt, und 
is eine Mögliche.

@Norbert
Siehe


Yalu X. schrieb: Norbert schrieb:
>> Tja, du nimmst 'ne Webseite, ich nehme einen Compiler. Wem wollen wir
>> nun glauben?
>
> Deine scanf-Anweisung funktioniert beim ersten Aufruf perfekt, aber
> nicht beim zweiten, wenn du die Anweisung zweimal hintereinander
> ausführst.
>
> Weil es vielleicht noch nicht jedem klar ist:
>
> %s überliest führenden Whitspace (zu dem auch Newlines gehören), dafür
> kann der eingegebene String selber keine Leerzeichen enthalten.
>
> %[…] überliest führenden Whitspace nicht, dafür kann der eingegebene
> String alle Zeichen enthalten, die zwischen den eckigen Klammern
> angegeben sind (ggf. auch Leerzeichen).


Und
Keine Ahnung welchen Compiler die benutzen vermutlich GCc und was der 
ander weiß ich nicht, vermutlich genau den Du auch benutzt
Ich kenne schon den Unterscheid....
Nutze das Voreingestellte, hatte gedacht, das würde so rüberkommen.
Ach so,der Dritte ist PElles C

von KArl Fred M. (Gast)


Lesenswert?

Zeno schrieb:
> ein Platz und 1 ebenfalls,
> Nein in der Deklaration legts Du ja im Gegensatz zu Pascal keinen
> Startindex fest, sondern lediglich die Arraylänge.

Ja, das hatte ich tatsächlich aus der PAscal Gewohnheit durcheinander 
gebracht
Witzig war aber , das es einen oder zwei gab, die das nicht 
nachvollziehen konnten, wie es zu so einem Fehler kommen kann.
Wenn man sich nie mit anderen Sprachen beschäftigt, erkennt man den 
Grund nicht.
Nun sollten die es auch nachvollziehen können

von Norbert (Gast)


Lesenswert?

wenn man im Input-Stream befindliche ›\n‹ am Anfang überlesen will, dann 
(Wobei 10 die Buffergröße darstellt.):
1
" %10[ a-zA-z0-9]"

Wurde aber auch schon erwähnt.
Das ist aber nun wirklich ALLES in den man pages beschrieben…

von DenkenMachtSpaß (Gast)


Lesenswert?

Also Leute,

wenn ich sowas wie

Peter K. schrieb:
> Also sinnlos weiter mit dir zu diskutieren. Ich wäre Dir aber zu Dank
> verpflichtet, wenn Du dich aus meinen Threads raushältst, da sie nur
> Unruhe bringen. Danke
> Setzen, 6.

oder

Peter K. schrieb:
> weil ich es gerne damit hinbekommen möchte!! da ich es so in den Büchern
> habe und es nicht klappt, was sollen immer diese dämlichen
> Gegenfragen?!!

und noch einige weitere solche Aussagen, von mindestens zwei Seiten, 
lese, denke ich mir "spinnen die eigentlich". Schade, dass hier im Forum 
immer öfter der Thread durch Pöbeleien zerstört wird. Ich frage mich 
immer wieder, wie man beim Schreiben eine solche Aggressivität 
entwickeln kann und das dann auch noch so kommuniziert?! Dann wartet 
doch bitte ein paar Minuten und lest den Text nochmal durch, bevor ihr 
ihn abschickt.

Übrigens: ich finde die Lösung mit scanf auch nicht schön, weil man da 
tricksen muss. Das ist für mich keine elegante, sichere Programmierung, 
sondern eher trial and error, was man ja auch an den vielen Versuchen 
hier im Thread sieht.

So, ihr könnt jetzt loslegen ;-)

Gruß

Marcus

von KArl Fred M. (Gast)


Lesenswert?

Ja, das ist die von mir genannte Lösung die ich ja jetzt mehrfach hier 
gezeigt hatte:-)
Bis auf die Stringbegrenzung, aber die hatte ich wie oben erwähnt, 
absichtlich rausgenommen, also nicht vergessen

"Das ist aber nun wirklich ALLES in den man pages beschrieben…§"
Na komm, dafür tun sich aber einige hier sehr schwer mit der Lösung, und 
auch Dein Lösungsansatz hatte ja nicht funktioniert, wegen des 
vergessenen Leerzeichens vor dem % z.B.
So, nun aber gute Nacht

von KArl Fred M. (Gast)


Lesenswert?

"Schade, dass hier im Forum
immer öfter der Thread durch Pöbeleien zerstört wird"

Jepp, sowasw wird ahlt angeheizt durch Kommentare die nicht heir her 
gehören und so verschelchtert sich der Ton dann immer weiter, da man 
irgendwann nur noch genevt ist, wenn dann einer nach dem anderen kommt 
mit Kommentaren wie
"warum Scanf "
Wieso denn unbedingt"
Ich verstehe nicht wieso unbedingt scanf"
"Wenn du unbedingt UB haben willst "
etc pp

Idealerweise würden solche Beiträge gelöscht, da sie überhaupt nichts 
zur Lösung der Frage beitragen


Der Thread kann jetzt auch geschlossen werden:-)
Die Lösung wurde jetzt ja mehrfach genannt in verschiedenen Variationen 
und erläutert

von Norbert (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Na komm, dafür tun sich aber einige hier sehr schwer mit der Lösung, und
> auch Dein Lösungsansatz hatte ja nicht funktioniert, wegen des
> vergessenen Leerzeichens vor dem % z.B.

Da wurde gar nichts vergessen. Ich habe dir einen funktionsfähigen 
Sourcecode für die Benutzung von scanf (inkl Leerzeichen) gezeigt und 
darauf hingewiesen das sämtliche Details dazu in den man pages zu finden 
sind.
Aber lassen wir's gut sein…

von MaWin (Gast)


Lesenswert?

KArl Fred M. schrieb:
> Jepp, sowasw wird ahlt angeheizt durch Kommentare die nicht heir her
> gehören und so verschelchtert sich der Ton dann immer weiter

Meinst du solche Aussagen wie:

KArl Fred M. schrieb:
> Na komm, dafür tun sich aber einige hier sehr schwer mit der Lösung

Oder sowas:

KArl Fred M. schrieb:
> Idealerweise würden solche Beiträge gelöscht

Oder, dass Hinweise auf tatsächliche Fehler abgebügelt werden mit:

KArl Fred M. schrieb:
> da sie überhaupt nichts zur Lösung der Frage beitragen

?

von DenkenMachtSpaß (Gast)


Lesenswert?

Peter K. schrieb:
> diese dämlichen
> Gegenfragen?!!

siehe oben: Du hast aber schon bemerkt, dass Du mit dem Wort "dämlich" 
auf die erste, eher harmlose Antwort mit der Pöbelei begonnen hast? :-/

Gruß

Marcus

von Trolldetektor (Gast)


Lesenswert?

Peter K. schrieb:
> Ich wäre Dir aber zu Dank verpflichtet, wenn Du dich aus meinen Threads
> raushältst

KArl Fred M. schrieb:
> Kannst du natürlich frei entscheiden, aber es handelt sich um eine
> Bitte.
> Also BITTE!!! lass es einfach.

Peter heisst jetzt Karl Fred, sonst ändert sich nix?

von Peter K. (Gast)


Lesenswert?

DenkenMachtSpaß schrieb:
> siehe oben: Du hast aber schon bemerkt, dass Du mit dem Wort "dämlich"
> auf die erste, eher harmlose Antwort mit der Pöbelei begonnen hast? :-/

Das kommt davon wenn Leute hier schon länger aktiv sind, und dann so 
Pappenheimer wie MalWin die hinlänglich für ihre Störungen bekannt sind, 
immer wieder in Threads stören. Da hat der Themenstarter dann 
verständlicherweise eine kurze Zündschnur, ist schon nachvollziehbar.
Da dadurch gleich zu begin, der Thread kaputt gemacht wird.
MAwin ist ein bekannter Troll

von ThomasDk. (Gast)


Lesenswert?

Das stimmt wohl, MaWin ist ein hinlänglich bekannter Troll hier und 
stört gerne mal.

von MaWin (Gast)


Lesenswert?

Peter K. schrieb:
> dann so
> Pappenheimer wie MalWin die hinlänglich für ihre Störungen bekannt sind,
> immer wieder in Threads stören. Da hat der Themenstarter dann
> verständlicherweise eine kurze Zündschnur, ist schon nachvollziehbar.

> MAwin ist ein bekannter Troll

Das Problem bist du, mit deiner kurzen Zündschnur.
Du kannst ja vor Wut noch nicht einmal meinen Namen richtig schreiben.

Ich habe nicht "gestört", sondern dich lediglich gefragt, warum scanf 
nicht in Frage gestellt werden darf.
Ich finde, das ist eine nachvollziehbare und legitime Frage.

Und du hast mit Pöbeln "geantwortet".

von ThomasDk. (Gast)


Lesenswert?

MaWn, kriegst Du dich auch irgendwann mal wieder ein?
Vielleicht solltest Du Dein Verhalten mal überdenken.
Das Thema hier ist abgeschlossen, die Lichter sind aus.
Es liest hier kaum noch einer mit

von MaWin (Gast)


Lesenswert?

ThomasDk. schrieb:
> MaWn, kriegst Du dich auch irgendwann mal wieder ein?
> Vielleicht solltest Du Dein Verhalten mal überdenken.

Ja.
MaWn sollte sein Verhalten einmal dringend überdenken.

> Das Thema hier ist abgeschlossen

Das habe ich bereits vor Stunden geschrieben und bekam heftigen 
Gegenwind.

> Es liest hier kaum noch einer mit

Anscheinend ja doch.

von ThomasDk. (Gast)


Lesenswert?

🤦🤦🤦🤦🤦🤦 🤦🤦

von Rolf M. (rmagnus)


Lesenswert?

KArl Fred M. schrieb:
> Jepp, sowasw wird ahlt angeheizt durch Kommentare die nicht heir her
> gehören und so verschelchtert sich der Ton dann immer weiter, da man
> irgendwann nur noch genevt ist,

Schön rumgedreht und die Schuld auf andere abgewälzt. "Dass ich so 
unverschämt wurde, ist die Schuld der Anderen, weil die nicht die 
Antwort geliefert haben, die ich hören wollte". Man sollte sich bei 
Diskussionen in Foren vor dem Abschicken immer erst mal überlegen, ob 
man das dem anderen genau so auch direkt ins Gesicht sagen würde, wenn 
es eine Diskussion wäre, wo alle sich persönlich gegenüber stehen. Und 
ich hoffe doch sehr, dass manche hier im real life einen doch deutlich 
gemäßigteren Diskussionsstil haben.

Trolldetektor schrieb:
> Peter heisst jetzt Karl Fred, sonst ändert sich nix?

Ich hatte mich auch schon gefragt, ob es sich (entgegen den 
Forumsregeln) um die selbe Person handelt. Allerdings sind beide schon 
seit über einem Jahr angemeldet und haben jeweils grob um die 400 
Postings verfasst. So einen Schmarren wird ja hoffentlich keiner 
veranstalten.

von DenkenMachtSpaß (Gast)


Lesenswert?

Rolf M. schrieb:
> Trolldetektor schrieb:

Trolldetektor!?

Na das wäre mal ein interessanter Anwendungsfall für die KI, ernst 
gemeint.
Blöd nur, wenn es viele "false positive" gibt. :-/

Gruß

Marcus

von W.S. (Gast)


Lesenswert?

Es ist in diesem Forum immer wieder das Gleiche.

MaWin schrieb:
> Wenn man einen Hammer hat, sieht alles wie ein Nagel aus.

Peter K. schrieb:
> weil ich es gerne damit hinbekommen möchte!! da ich es so in den Büchern
> habe und es nicht klappt, was sollen immer diese dämlichen
> Gegenfragen?!!

So, ich formuliere mal das Ganze etwas um, damit es klarer wird:

Peter: "Ich will genau an DIESER Stelle mit dem Kopf durch die Wand. Es 
geht aber nicht, sonder ich krieg bloß eine Beule"

Nun hat dir MaWin in seiner dezenten Art bereits gesagt: "Laß es sein, 
probiere das Ganze mal ein paar Schritte daneben, da ist eine Tür"

Und Peter antwortet: "Ich WILL aber! Und genau HIER!"

So ein kindisches Verhalten, das nur von Uneinsichtigkeit (aka 
mangelndem Intellekt) herrührt, trifft man hier fast jeden Tag.

An den Peter: Ist dir eventuell schon mal aufgefallen, daß ein 13/17 
Schlüssel nicht an alle Schrauben paßt? Und? Lehrt dich das etwas? 
Vielleicht, daß auch fertige Funktionen nicht für alle Anwendungen 
passen? Oder daß sie exakt den Schraubenkopf erwarten, für den sie 
gemacht sind?

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.