BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C Mehrere Worte mit scanf() in verschiedene Variablen ablegen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Mehrere Worte mit scanf() in verschiedene Variablen ablegen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
byteworm byteworm ist männlich
Aufsteiger


Dabei seit: 09.10.2002
Beiträge: 31

Mehrere Worte mit scanf() in verschiedene Variablen ablegen       Zum Anfang der Seite springen

Hi,

wie mach ich das scanf in C jedes wort das ich eingebe in einer extra variable gespeichert wird ???

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von byteworm: 10.03.2003 01:45.

10.03.2003 01:44 byteworm ist offline E-Mail an byteworm senden Beiträge von byteworm suchen
Deef Deef ist männlich
...


Dabei seit: 24.08.2002
Beiträge: 431

      Zum Anfang der Seite springen

Hmm ich weiß nicht ob ich Dich richtig verstehe ...

scanf("%s %s %s", var1, var2, var3);

Ich hab aber irgendwann mal gelernt, das man Zeichenketten nicht mit scanf einlesen sollte, da daß alles liest bis zum nächsten blank ...

Ich glaub mich zu erinnern, dass die alternative fscanf heisst, aber diese Angabe ist ohne Gewähr großes Grinsen

__________________
Was sagen uns Signaturen?! 1.Ich kann Latein 2.Ich bin umheimlich tiefgründig 3.Ich kann googlen 4.Ich lese die Lyrics der Lieder die ich höre 5.Ich schreibe und denke mir Scheisse aus die keiner lesen will...
10.03.2003 07:26 Deef ist offline E-Mail an Deef senden Beiträge von Deef suchen
byteworm byteworm ist männlich
Aufsteiger


Dabei seit: 09.10.2002
Beiträge: 31

Themenstarter Thema begonnen von byteworm
      Zum Anfang der Seite springen

mit fscanf liest man aus einer datei nicht aber von der tastatur was ein. und das mit dem

scanf("%s %s %s", var1, var2, var3);

ist scheiße weill man ja 3 wörter eintippen muss, ich meine aber was anderes. nämlich das jedes wort in ner extra variable gespeichert wird ohne das vorgegeben ist wie viele wörter man einzutippen hat.
10.03.2003 13:43 byteworm ist offline E-Mail an byteworm senden Beiträge von byteworm suchen
Deef Deef ist männlich
...


Dabei seit: 24.08.2002
Beiträge: 431

      Zum Anfang der Seite springen

Also direkt zu Deinem problem kann ich Dir leider nicht helfen, aber du kannst mit fscanf genau so von der Tastatur lesen wie aus einer Datei.

Mein Prof erzählte damals, dass es irgendwann man einen Angriff gab, wo ein programm mit scanf gelesen hat und der angreifer "einfach" ein eigenes Programm einlesen lassen hat (solange keine white spaces drin sind liesst scanf ja immer weiter)
Was davon stimmt kann ich allerdings nicht sagen *g*

__________________
Was sagen uns Signaturen?! 1.Ich kann Latein 2.Ich bin umheimlich tiefgründig 3.Ich kann googlen 4.Ich lese die Lyrics der Lieder die ich höre 5.Ich schreibe und denke mir Scheisse aus die keiner lesen will...
10.03.2003 14:38 Deef ist offline E-Mail an Deef senden Beiträge von Deef suchen
LX LX ist männlich
El Comandante en Jefe


images/avatars/avatar-2290.gif

Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx

Achtung       Zum Anfang der Seite springen

Warum lässt du net einen ganz normalen String mit scanf() komplett einlesen und spaltest den danach an den Spaces in Teilstrings auf? Weiß jetzt net im Kopf, ob's da in C eine fertige Funktion dafür gibt, ansonsten machst du's eben von Hand (so schwer isses ja net).

__________________
JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard

"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

10.03.2003 14:49 LX ist offline E-Mail an LX senden Homepage von LX Beiträge von LX suchen
Deef Deef ist männlich
...


Dabei seit: 24.08.2002
Beiträge: 431

      Zum Anfang der Seite springen

Weil scanf() an einem space aufhört zu lesen ;o)

bei fscanf() kann man zusätzlich die länge angeben, die gelesen werden soll.

__________________
Was sagen uns Signaturen?! 1.Ich kann Latein 2.Ich bin umheimlich tiefgründig 3.Ich kann googlen 4.Ich lese die Lyrics der Lieder die ich höre 5.Ich schreibe und denke mir Scheisse aus die keiner lesen will...
10.03.2003 14:58 Deef ist offline E-Mail an Deef senden Beiträge von Deef suchen
byteworm byteworm ist männlich
Aufsteiger


Dabei seit: 09.10.2002
Beiträge: 31

Themenstarter Thema begonnen von byteworm
      Zum Anfang der Seite springen

@LX, wie mach ich das den, einen string in teilstringe spalten ???
10.03.2003 15:49 byteworm ist offline E-Mail an byteworm senden Beiträge von byteworm suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

@Jutaro: So etwas in der Art gibt es schon. Ich habe mal ein Hackit dazu geschrieben (schau mal im Hackit-Forum). Ich bin zwar nicht sicher, ob das ein C-Compiler so akzeptiert (Variablendeklaration mitten in der Funktion), der adäquate Programmablauf in Assembler funktioniert auf jeden Fall.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
void split_string (char *cInputStr)
{
	unsigned int lStrLen = 0;
	unsigned int lNumFragments = 0;

	while ((*(cInputStr +  lStrLen) != "\n") && (*(cInputStr + lStrLen) != 0x00)) 
	{
		if (*(cInputStr + lStrLen) == " ")
		{
			lNumFragments++;
			*(cInputStr + lStrLen) = 0x00;
		}
		lStrLen++;
	}

	lNumFragments++;
	char *cSplitArray[lNumFragments];

	for (lNumFragments = lNumFragments - 1; lNumFragments >= 0; lNumFragments--)
	{
		while ((*(cInputStr + lStrLen) != 0x00) && (lStrLen != 0)) lStrLen--;
		cSplitArray[lNumFragments] = cInputStr + lStrLen;
	}

}


Zugegeben: Man kann das ganze wesentlich effizienter lösen, indem man Speicher allokiert, das hätte auch noch den Vorteil, das man die gesplitteten Strings auch jenseits der Split Funktion verwenden kann. Die Lösung hab ich schnell mal hingeschrieben (natürlich nicht auf Fehlerfreiheit getestet). Sollte ja auch nur generell einen Lösungsweg skizzieren.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Compuholic: 10.03.2003 18:50.

10.03.2003 18:47 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
qwartz8051
Neuling

Dabei seit: 10.03.2003
Beiträge: 5
Herkunft: DatenLeitung

      Zum Anfang der Seite springen

Also wenn es um ANSI C geht
würde ich es so machen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
char *eingabe;
char *texte[25];
int i;
i=0;

while(eingabe!="")
{
 clrscr();
 gets(eingabe);
 texte[i]=eingabe;
 i++;
}


So oder so ungefähr....

__________________
__Nichts_ist_wie_es_scheint__
~~~~~~~~~~~~~~~~~~~
Ich habe keine Feinde
Ich absolviere keinen Kriege
Ich clone keine Monster
Ich kaufe keine Dorgen
Ich erstelle keine Waffen
Ich respektiert andere Menschen
~~~~~~~~~~~~~~~~~~~~~
10.03.2003 19:41 qwartz8051 ist offline E-Mail an qwartz8051 senden Beiträge von qwartz8051 suchen
byteworm byteworm ist männlich
Aufsteiger


Dabei seit: 09.10.2002
Beiträge: 31

Themenstarter Thema begonnen von byteworm
      Zum Anfang der Seite springen

@qwartz8051, wenn ich deinen code compiliere gibt es zwar keine fehler, aber wenn ich das programm dan starte und ein paar worte eintippe stürtzt das programm ab.
10.03.2003 21:06 byteworm ist offline E-Mail an byteworm senden Beiträge von byteworm suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

immer diese C-ler probleme, was doch für eine einfache und klare Sprache dagegen Pascal ist Augenzwinkern
dass das Programm abstürzt, dürfte nicht verwunderlich sein, denn mit gets liest man (soweit ich weiß) eine zeichenkette ein, jedoch ist
"eingabe" gerade ein zeichen groß - wohin solls also eingelesen werden? der Speicher wird munter weiterhin überschrieben - somit hat man hier auch eine Art Bufferoverflow erschaffen für einen neuen Hackit smile
eine lösung wäre mit calloc speicher dafür(eingabe) zu reservieren...
jedoch kann man dann gleich mit einer verketteten Liste arbeiten (statt mit *texte[25]).
PS: ich könnte auch komplett falsch liegen -dann aber bitte nicht erschlagen Augen rollen

PS: [Notiz an mich selber]: C-Buch rausholen und lernen,lernen,lernen! warum muss C nur soviele Ausnahmen haben...
[/notiz]

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von CDW: 10.03.2003 21:24.

10.03.2003 21:19 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

Der Code von qwartz8051 enthält offenbar ein grundlegendes Verständnisproblem bei Zeichenketten.

Wenn ich eine Variable für eine Zeichenkette von z.B. 20 Zeichen benötige, dann benutze ich "char eingabe[21]". Das bedeutet, das ich 21 Bytes an Speicher reserviere, von denen jedes ein Zeichen aufnehmen kann. Das ganze ist also ein stinknormales Array. (Kurze Anmerkung: Man mag sich vielleicht wundern, warum ich 21 Bytes reserviere. Das liegt daran, das man ja noch 1 NULL-Byte einplanen muß, mit dem die Zeichenkette terminiert wird.)

Wenn ich eine Variable deklariere und dem Variablennamen ein * voranstelle, wird nicht Speicher für die Zeichenkette reserviert, sondern es wird Speicher für einen Wert reserviert, der eine Speicheradresse enthält (ein sog. Zeiger). "char *eingabe" kann also selbst keinen Zeichen aufnehmen, sondern nur eine Speicheradresse, die auf die Anfangsadresse der Zeichenkette zeigt.

Wenn ich jetzt also z.B. "int *eineZahl" deklariere und im Programm "eineZahl = 1" zuweise, meine ich damit, das die Variable "eineZahl" auf die Speicheradresse 0x00000001 zeigt (die ungültig ist). Das geht solange gut, wie ich das im ganzen Programm konsequent falsch mache (da eine Variable vom Typ int genausoviel Speicher belegt wie ein Zeiger auf eine Speicheradresse (int *). Da Speicheradressen immer 32-Bit breit sind, hilft der Zufall, das das Programm nicht abstürzt.)

Kritisch wird es, wenn mann versucht nicht den Wert der Variable zu lesen, sondern von der Speicheradresse auf die sie zeigt. Das nennt man dann Dereferenzierung. Ein Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
int   i = 20;    //Eine Variable mit dem Wert 20 deklarieren
int   *a;    //Eine Zeigervariable deklarieren
a = &i;      //Zeigervariable a nimmt die Speicheradresse von i auf
printf("%d", a); //gibt den Inhalt der Zeigervariable aus (eine Speicheradresse)
printf("%d", *a);  //gibt den Inhalt der Adresse aus, auf die a "zeigt"


Nicht mißverstehen. Das soll nur eine kurze Erklärung zu Zeigern sein und keinerlei persönliche Kritik. Ich weiß, das Zeiger ein für Anfänger schwieriges Thema sind. Das mag am Anfang etwas verwirrend sein. Aber man gewöhnt sich schnell daran.
10.03.2003 23:20 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
byteworm byteworm ist männlich
Aufsteiger


Dabei seit: 09.10.2002
Beiträge: 31

Themenstarter Thema begonnen von byteworm
      Zum Anfang der Seite springen

Und wie kann ich jetzt mit einer scanf oder gets anweisung jedes wort in einer extra variable speichern ???
10.03.2003 23:56 byteworm ist offline E-Mail an byteworm senden Beiträge von byteworm suchen
Flanders
unregistriert
      Zum Anfang der Seite springen

Ich habe mir das, was oben steht jetzt nicht alles durchgelsen, aber mit Scanf kannst du nur eine Tastatur eingabe auslesen und in eine Variable speichern z.B.

(...)
printf("\nGeben Sie eine Zahl ein");
scanf("%i", &Eingabe);
(...)

In der Variabel "Eingabe" , die du natürlich vorher deklarien muss, steht nun die Zahl drin , die der Benutzer eingegeben hat.
11.03.2003 15:41
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

@Byteworm. Siehe meinen Code oben. Der Funktion muß nur die gesamte Zeichenkette übergeben werden. Dann wird an den Leerzeichen geplittet. Übrigens noch eine Anmerkung zum Code. Unter Umständen funktioniert der auf Windows nicht so wie er soll, da Windows \r\n als Zeilenende benutzt. Linux hingegen benutzt nur \n. Also ausprobieren und bei Bedarf abändern.

Die Primitivlösung wäre so zu realisieren. (Absolut kein sicherheitsbewußter Programmierstil)

char cEingaben[20][30];
int i = 0;

do
{
gets(&cEingaben[i]);
i++;
} while (cEingaben[i-1] != 0x00)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Compuholic: 11.03.2003 17:23.

11.03.2003 17:21 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C Mehrere Worte mit scanf() in verschiedene Variablen ablegen

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH