Namen Eingabe und Ausgabe < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Aufgabe | Das Programm soll maximal 10 Namen und minimal 1 Name(aus max. 50 Zeichen) von der Tastatur einlesen und in ein Dynamisches Feld speichern und ausgeben. |
Hallo, alles funktioniert soweit gut, nur bei Ausgabe der Namen erscheint auf dem Bildschirm statt Namen fogendes:
Name 1: <null>
Name 2: <null>
u.s.w.
wo könnte ein Fehler sein?
1: | #include "stdafx.h"
| 2: | #include "vsconio.h"
| 3: | #include "stdio.h"
| 4: | #include "string.h"
| 5: | #include "stdlib.h"
| 6: |
| 7: | void GetNamen(char *NamPtrArr[], int NamAnz);
| 8: | void ClrStdIn(void);
| 9: | void OutNamen(char *KopfText,char *NamPtrArr[], int NamAnz);
| 10: | void FreeDynMem(char *NamPtrArr[], int NamAnz);
| 11: | #define nammax 10
| 12: | #define nammin 1
| 13: | #define zeichmax 50
| 14: |
| 15: | int main(void)
| 16: | {
| 17: |
| 18: | int NamAnz = 0;
| 19: | char **PtrNamPtrArr=NULL;
| 20: | clrscr();
| 21: | printf("Anzahl der Namen: ");
| 22: | scanf("%d", &NamAnz);
| 23: | if(NamAnz>nammax) NamAnz=nammax;
| 24: | if(NamAnz<nammin) NamAnz=nammin;
| 25: | ClrStdIn();
| 26: | PtrNamPtrArr= (char**) calloc(nammax, sizeof(char*));
| 27: | GetNamen( PtrNamPtrArr, NamAnz );
| 28: | OutNamen( "Ausgabe 1 in Orig. Reihenfolge",PtrNamPtrArr, NamAnz );
| 29: | FreeDynMem( PtrNamPtrArr, NamAnz);
| 30: | return 0;
| 31: | }
| 32: |
| 33: |
| 34: |
| 35: | void GetNamen(char *NamPtrArr[], int NamAnz)
| 36: | {
| 37: | char *ptrNam;
| 38: | int i, ende;
| 39: | char name[zeichmax];
| 40: |
| 41: | for(i=0;i<NamAnz;i++)
| 42: | {
| 43: | printf("Name %2d: ", i+1); fgets(name,zeichmax+1,stdin);
| 44: | ende=strlen(name)-1;
| 45: | if(name[ende]=='\n')
| 46: | {
| 47: | name[ende]='\0';
| 48: | ende--;
| 49: | }
| 50: | else
| 51: | {
| 52: | ClrStdIn();
| 53: | }
| 54: | }
| 55: | }
| 56: |
| 57: |
| 58: | void ClrStdIn(void)
| 59: | {
| 60: | char dummy[81];
| 61: | gets(dummy);
| 62: | }
| 63: |
| 64: | void OutNamen(char *KopfText,char *NamPtrArr[], int NamAnz)
| 65: | {
| 66: | int i;
| 67: | clrscr();
| 68: |
| 69: | printf(" %s\n\n", KopfText);
| 70: | for(i=0; i<NamAnz; i++)
| 71: | {
| 72: | printf("Name %2d: %s\n ", i+1, NamPtrArr[i]);
| 73: | }
| 74: | printf("\n weiter mit [return]: ");
| 75: | ClrStdIn();
| 76: | }
| 77: |
| 78: | void FreeDynMem(char *NamPtrArr[], int NamAnz)
| 79: | {
| 80: | int i;
| 81: | for(i=0;i<NamAnz;i++)
| 82: | {
| 83: | free(NamPtrArr[i]);
| 84: | }
| 85: | free(NamPtrArr);
| 86: | } |
gruß capablanca
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:34 Di 16.02.2010 | Autor: | rainerS |
Hallo!
> Das Programm soll maximal 10 Namen und minimal 1 Name(aus
> max. 50 Zeichen) von der Tastatur einlesen und in ein
> Dynamisches Feld speichern und ausgeben.
> Hallo, alles funktioniert soweit gut, nur bei Ausgabe der
> Namen erscheint auf dem Bildschirm statt Namen fogendes:
>
> Name 1: <null>
> Name 2: <null>
>
> u.s.w.
>
> wo könnte ein Fehler sein?
Du liest in der Funktion GetNamen zwar die Eingabe in den Puffer name, aber dann machst du damit nichts mehr, sodass die Zeichen am Ende der Funktion verloren gehen. Außerdem versuchst du, in FreeDynMem Speicher freizugeben, den du nirgendwo alloziert hast. (Einfacher Test: calloc wird einmal aufgerufen, free aber NamAnz+1 mal.)
Du musst ein char-Array anlegen, die Eingabe dorthin kopieren, und dann den Pointer auf das Array in NamPtrArr ablegen.
Tipp: Benutze ein Werkzeug wie valgrind, das dir fehlerhafte Aufrufe deiner Speicherverwaltung sofort meldet.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:38 Di 23.02.2010 | Autor: | capablanca |
Danke sehr!
|
|
|
|