Forum: PC-Programmierung C: int und *char in void-Funktion einlesen


von *GAST* (Gast)


Lesenswert?

Hallo,
ich möchte eine void-Funktion schreiben, die in main() aufgerufen wird, 
und in int zahl und in char* zeichen eine Zahl bzw. eine Zeichenkette 
einliest. Warum funktioniert das nicht?

Ich bin mir nicht sicher, wie ich z.B. zahl in main() deklariere. In 
einlesen() muss ich ja die Adresse übergeben, aber dann müsste ich zahl 
ja nicht als Zeiger darstellen, oder?
Sollte ich zahl "normal" deklarieren und nur die Adresse der Variablen 
weitergeben?
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
5
void einlesen(int *zahl, char *zeichen)
6
{
7
  printf("Zahl eingeben: ");
8
  scanf("%d", &zahl);
9
  printf("Text eingeben: ");
10
  gets(zeichen);
11
}
12
13
int main()
14
{
15
  int zahl;
16
  char *zeichen[250];
17
  
18
  einlesen(zahl, zeichen);
19
  system("pause");
20
  return 0;
21
}

von Thomas B. (escamoteur)


Lesenswert?

Na Deine Funktion erwartet ja zahl als Pointer, dann musst Du beim 
Aufruf auch die Adresse von zahl überegeben ( &Zahl).

Thomas

von Krapao (Gast)


Lesenswert?

1
#include <stdio.h>
2
#include <stdlib.h>
3
4
void einlesen(int *zahl, char *zeichen)
5
{
6
  printf("Zahl eingeben: ");
7
  scanf("%d", zahl); // 2, 3
8
  printf("Text eingeben: ");
9
  gets(zeichen);
10
}
11
12
int main()
13
{
14
  int zahl;
15
  char *zeichen[250]; // 1
16
  
17
  einlesen(&zahl, zeichen); // 2
18
  system("pause");
19
  return 0;
20
}

1/ 
http://openbook.galileocomputing.de/c_von_a_bis_z/011_c_arrays_001.htm
2/ 
http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_001.htm
3/ 
http://openbook.galileocomputing.de/c_von_a_bis_z/004_c_ein_ausgabe_001.htm

von Krapao (Gast)


Lesenswert?

>   char *zeichen[250]; // 1

soll heissen:
  char zeichen[250]; // 1

von *GAST* (Gast)


Lesenswert?

Jetzt ist aber nach Zahleingabe und Enter drücken das Programm beendet, 
ohne den String abzufragen.

Zu zahl:
Sehe ich es richtig, dass an die Funktion einlesen, die Adresse von zahl 
übergeben wird, die Funktion einlesen selbst aber den Inhalt von der 
Variablen erwartet?

von Krapao (Gast)


Lesenswert?

Nein das siehst du falsch.

Die Funktion einlesen() erwartet einen Pointer auf int als erstes 
Argument und die darin aufgerufene Funktion scanf() ebenfalls.

Beim Aufruf der Funktion einlesen() wird der Adressoperator & benutzt, 
um aus der int Variablen zahl aus main() diesen Pointer zahl in 
einlesen() zu erzeugen.

Es ist für dich als Anfänger nicht sonderlich schlau oder einsichtig, 
dass du zwei Variablen mit gleichem Namen hast:

1/ int zahl in main()
2/ int *zahl in einlesen()

Vielleicht blickst du eher durch, wenn du die unterschiedlich nennst!

von Trollversteher (Gast)


Lesenswert?

*GAST* schrieb:
> die Funktion einlesen selbst aber den Inhalt von der
> Variablen erwartet?

Warum fragst du das wenn du selbst definiert hast:

*GAST* schrieb:
> void einlesen(int *zahl, char *zeichen)

Erkläre uns und dir doch mal selbst was du damit machen willst.

von Klaus W. (mfgkw)


Lesenswert?

Trollversteher schrieb:
> Erkläre uns und dir doch mal selbst was du damit machen willst.

Hausaufgabe lösen, ohne C zu lernen :-)

von Klaus W. (mfgkw)


Lesenswert?

*GAST* schrieb:
> Jetzt ist aber nach Zahleingabe und Enter drücken das Programm beendet,
> ohne den String abzufragen.

Das wird davon kommen, daß das scanf() ja nur eine Zahl lesen soll, also 
auch nur die Ziffern aus der Eingabe entnimmt. Das hinter der Zahl 
eingetippte Enter bzw. Zeilenvorschub (\n) bleibt in der Eingabe stehen.

Wenn du jetzt den String holst, wird diese (außer dem \n leere) Zeile 
genommen. Du hast also gar keine Gelegenheit mehr, noch mehr einzugeben.

Das sind so die Eigenheiten der gepufferten Eingabe in Standard-C...

von Klaus W. (mfgkw)


Lesenswert?

PS: man sollte zum Einlesen nie gets() nehmen, sondern ausschließlich 
fgets( ..., ..., stdin )

von Krapao (Gast)


Lesenswert?

> Jetzt ist aber nach Zahleingabe und Enter drücken das Programm beendet,
> ohne den String abzufragen.

Beim Einlesen mit scanf wird das RETURN als Ende der Eingabe der Zahl 
nicht aus dem Tastaturpuffer gelesen. Das nachfolgende gets() bekommt 
dieses RETURN und meint, die Eingabe des Texts zeichen ist beendet.

Wenn du mit dem Entfernen des RETURNs aus dem Tastaturpuffer 
experimentierst, achte auch mal darauf, was passiert, wenn du 
42<LEERZEICHEN><RETURN> oder a42<RETURN> eingibst.

Direktes Einlesen von Anwendereingaben mit scanf() in einem Programm 
macht man nicht, wenn man nicht auf 110% richtige Eingaben vom Anwender 
vertrauen kann.

von Klaus W. (mfgkw)


Lesenswert?

... oder man reagiert zumindest auf die Eingabe und die Rückgabewerte 
sinnvoll, dann kann man auch mit scanf arbeiten.

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.