2016-07-29 60 views
0

ich einen Code haben einen Stapel mit Array zu implementieren, hier der vollständige Code: hereStack: nicht in der Lage, ein paar Zeichen in Reihe zu schieben

Der Fall ist, warum kann ich nicht mehr als ein Zeichen zu drücken, aber nur ein Zeichen? aber ich habe Klick einige Variablen initialisiert ein struct für ihre Push einige Zeichen in Form eines Arrays mit:

struct stackMhs { 
char nama[10]; 
char npm[10]; 
char telp[10]; 
int size; 
}; 

struct stackMhs stackMhsbaru; 

Dies ist die push() Funktion mit einem Parameter, der den Inhalt der Daten wird in die Funktion main():

void push(char nm, char np, char tel) { 
if(stackMhsbaru.size != 10) { 
stackMhsbaru.nama[stackMhsbaru.size + 1] = nm; 
stackMhsbaru.npm[stackMhsbaru.size + 1] = np; 
stackMhsbaru.telp[stackMhsbaru.size + 1] = tel; 
stackMhsbaru.size++; 
} 
else { 
printf("stack is full!"); 
} 
} 

das Problem ist, wenn ich ' verwenden, um Daten zu füllen ist nur ein Zeichen an der push() Funktion wie push('a','b','c'); wenn auf keine Fehler kompilieren, aber wenn ich verwenden " wie push("aa","bb","cc"); wenn bei kompilieren Fehler auftritt:

main.c: In function 'main': 
main.c:60:6: warning: passing argument 1 of 'push' makes integer from pointer without a cast [-Wint-conversion] 
push("aa", "bb", "cc"); 
    ^
main.c:23:6: note: expected 'char' but argument is of type 'char *' 
void push(char nm, char np, char tel) { 
    ^
main.c:60:12: warning: passing argument 2 of 'push' makes integer from pointer without a cast [-Wint-conversion] 
push("aa", "bb", "cc"); 
     ^
main.c:23:6: note: expected 'char' but argument is of type 'char *' 
void push(char nm, char np, char tel) { 
    ^
main.c:60:18: warning: passing argument 3 of 'push' makes integer from pointer without a cast [-Wint-conversion] 
push("aa", "bb", "cc"); 
       ^
main.c:23:6: note: expected 'char' but argument is of type 'char *' 
void push(char nm, char np, char tel) { 
    ^

Meine Frage ist: eine Lösung?

+0

Ihre Push-Funktion nimmt „char“ Parameter verwenden, müssen Sie ersetzen es von Char * oder einem String-Datentyp – Berkay92

+0

Wo ist 'Größe' initialisiert? – sjsam

Antwort

2

In C, alles in einem '' ein Charakter (deklarierten Verwendung char) und alles, was im Innern "" stellt eine Zeichenkette, die ein Null-terminierte Array von char s ist.

Sie können kein Array von char s einer einzelnen char Variablen zuweisen, daher sehen Sie die Warnungen.

Erklärung der Warnung:

warning: passing argument 1 of 'push' makes integer from pointer without a cast

Zur Erläuterung halber wird angenommen, dass der Compiler bedeutet char wenn es int sagt, dann ist im Grunde zu beschweren, dass Sie einen char Array-Typs zuweisen versuchen zu einem char ohne explizit Compiler zu sagen, dass Sie dies tun möchten.

korrekte Art und Weise zu tun, was Sie versuchen:

Übergeben Sie die Zeichenfolge Zeichen für Zeichen an die push Funktion in einer Schleife aufgerufen.

+2

'nehme an, dass der Compiler char bedeutet, wenn er int' sagt. Man muss nicht annehmen, dass der Compiler "char" bedeutet, was ein Integer-Typ ist. – sjsam

1

Zuerst sollten Sie versuchen, sich mehr um Ihren Codeeinzug zu kümmern, es wäre einfacher für uns, ihn zu lesen.

Jetzt für Ihr Problem: Es gibt einen großen Unterschied in C zwischen 'c' und "c". Der erste ist nur ein Zeichen und der zweite ist ein null terminiertes Array von Zeichen, was völlig anders ist.

Wenn Sie push("aa", "bb", "cc"); aufrufen, geben Sie einer Funktion, die 3 Zeichen benötigt, 3 Zeichenfelder an, weshalb Ihr Code nicht funktioniert.

Um dies zu umgehen, können Sie Ihre Funktion mehr Zeit mit all den verschiedenen Charakteren Ihrer Array von Zeichen nennen:

char *str = "foo"; 
while (*str) 
    push(*(str++)); 

diese Weise die while schlingt in der Zeichenfolge und rufen Sie die push() Funktion werden alle die verfügbaren Zeichen in str.

0

, wenn Sie die opeator verwenden [] Sie erhalten einen Zeiger verkohlen, wenn Sie es für char verwenden möchten * es so

struct stackMhs { 
char* nama[10]; 
char* npm[10]; 
char telp[10]; 
int size; 
}; 

void push(char* nm, char* np, char* tel) { 
if(stackMhsbaru.size != 10) { 
    if(!nm)strcpy(stackMhsbaru.nama[stackMhsbaru.size + 1],nm); 
    if(!np)strcpy(stackMhsbaru.npm[stackMhsbaru.size + 1],np); 
    if(!tel)strcpy(stackMhsbaru.telp[stackMhsbaru.size + 1],tel); 
stackMhsbaru.size++; 
} 
}