C: int und *char in void-Funktion einlesen

Gast #2720610
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
}
Gast #2720636
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
Gast #2720670
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!
#2720681
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...
Gast #2720701
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren