2016-07-10 16 views
0
#include <stdio.h> 
#include <stdlib.h> 

struct test 
{ 
    int id; 
    char name[20]; 
}; 

int main() 
{ 

struct test t1; 

    t1.id=1; 
    fflush(stdin); 
    fgets(t1.name,20,stdin); 

    print((&t1.name));   
    print1(t1.id,&(t1.name));  

} 
void print(struct test *name) 
{ 
    puts(name); 
} 

void print1(struct test id,struct test *name) 
{ 

    printf("\n%d\n",id); 


    puts(name); 
} 

Wenn ich laufe dieses Programm es für die Eingabe fragtWarum funktioniert Puts im folgenden Code nicht?

Test [Enter]

Ausgang kommt aus

Test (dann endet Programm)

Warum die ersten Puts gearbeitet und warum setzt in zweiter Funktion nicht? Ja, es gibt eine Option, komplette Struktur zu senden, aber ich möchte wissen, was hier falsch ist.

+3

zu

void print(char name[]) // because you wish to print a null terminated array of characters. 


print((&t1.name)); 

zu

geändert werden sollte geändert werden,' ist falsch. Entfernen Sie es. –

+1

vielleicht Kompilierung mit allen Warnungen auf helfen würde –

+0

Ich habe begonnen, Flush zu verwenden, wenn es notwendig ist, viele String-Variablen gleichzeitig zu nehmen, zum Beispiel string1, string2 mit fgets. Wenn ich nicht fflash() die Eingabe von String ist wierd – ekaf

Antwort

2

Ihr Programm nicht aus mehreren Gründen arbeiten:

  • Sie Funktionen aufrufen, die Erklärungen fehlt vorne - Sie sollten Warnungen sehen, wenn Ihr Programm kompiliert wird. Ignorieren Sie sie nicht
  • Ihre Funktionen nehmen Argumente des falschen Typs - Sie sollten den Typ erhalten, der individuellen Feldern entspricht, z. void print1(int id, char *name) oder Sie sollten die gesamte Struktur, nach Wert oder Zeiger, dh void print1(struct test t)

Sobald Sie diese beiden Probleme zu beheben, und stellen Sie sicher, dass Ihr Programm kompiliert Warnung frei, mit allen Compiler-Warnungen aktiviert ist, das Problem sollte passieren gelöst werden.

+0

Vielleicht hinzufügen, um alle Warnungen einzuschalten. –

+0

danke, dass gearbeitet .Meine 2 weitere Frage .Erste ich nicht bekommen, wo ich fehlt Vorwärtsdeklaration 2. Warum tun die ersten Druck (Struct Test * Name) {puts (name)} arbeiten? – ekaf

+1

@ekaf Das erste 'puts' funktioniert durch Zufall. Leider ist dies in C üblich - da die Sprache so niedrig ist, würde sehr oft ein falsches Programm etwas produzieren, das der korrekten Ausgabe ähnelt. Dies wird als undefiniertes Verhalten bezeichnet. – dasblinkenlight

0

Sie benötigen diese

void print(char *name) 
{ 
    puts(name); 
} 

Und der Anruf muss

print(t1.name);   

puts nimmt char * (oder eigentlich const char *) sein.

t1.name hat den Datentyp char *

Ähnlich

void print1(struct test id, char *name) 
{ 

    printf("\n%d\n",id); 


    puts(name); 
} 

und den Anruf

print1(t1.id,& t1.name);  

Der Name eines Arrays in die Adresse degeneriert des ersten Elements eines Arrays . Wenn also t1.name an Funktion übergeben wird, wird es die Adresse des Starts des Char-Arrays.

1
void print(struct test *name) 

sollten Für einen Start `fflush (stdin)

print(t1.name); //name is the array you wish to print 
+0

'print ((t1.name);' vielleicht 'print (t1.name);' –

+0

@EdHeal: Danke Ed, wie immer :) – sjsam

+1

was ist, wenn meine Anforderung ist, es als Referenz zu senden so dass ich diese Funktion vor dem Drucken ändern kann? – ekaf