2016-04-01 17 views
0

Ich habe ein bisschen Token verwirrt mit, sagen, wenn:Verwenden Wert von Token (strtok) in Funktion in c

int main(void) { 
    char input[100]; 
    fgets(input, 100, stdin); 
    char * token = strtok(input, " "); 
    char * height = strtok(NULL, " "); 
    char * width = strtok(NULL, " "); 
    if (height > 9 && width > 9) 
     set(height, width); 
} 

void set(char * height, char * width) { 
    for (int i = 0; i < height + 1; i++) { 
     for (int j = 0; j < width + 1; j++) { 
      mine[i][j] = '*'; 
     } 
    } 
} 

Ich fand nur, dass ich nicht "height + 1" verwenden kann, kann jemand sagen, Kann ich den Wert der Höhe irgendwie nutzen? Außerdem sollte char * height und char * width in void gesetzt werden?

Danke!

+1

Warum vergleichen Sie 'char *' s mit ganzzahligen Konstanten? Das ist eine Einschränkung der Einschränkung, Ihr Compiler sollte sich darüber beschwert haben. – EOF

+1

In 'set' -Funktion,' height' und 'width' sind Zeiger ... Sie sollten sie dereferenzieren (' i <* height + 1; ') oder vorher in intergers (' strtol (...) ') umwandeln benutze sie. – purplepsycho

Antwort

0

strtok() schneidet die C-Zeichenfolge in Teile und gibt Zeiger auf die begrenzten Teilzeichenfolgen zurück. Wenn Sie also "480 640" eingeben, zeigt der Zeiger height auf "480" und der Zeiger width auf "640". Also zeigen sie auf (ascii) Strings nicht auf ganze Zahlen.

Wenn Sie ganze Zahlen benötigen, können Sie diese zuerst konvertieren müssen, zum Beispiel mit atoi():

int main(void){ 
    ... 
    char *token=strtok(input, " "); 
    char *s_height=strtok(NULL, " "); // these are strings 
    char *s_width=strtok(NULL, " "); 
    int height=atoi(s_height), width=atoi(s_width); // convert to integers 
    ... 
} 

void set(int height, int width){ 
    ... 
} 
0

Nachdem mit fgets() aus Ihrem Stream zu lesen und Zeichenüber es, können Sie Ihre Strings in den entsprechenden Integer-Wert umwandeln sollten.

char *heightStr = strtok(NULL, " "); 
char *widthStr = strtok(NULL, " "); 
int heightVal = atoi(heightStr); 
int widthVal = atoi(widthStr); 

Ihre set() Funktion sollte auch ganze Zahlen verwenden, da es Parametertypen ist, nicht char* dh. void set(int height, int width)

+0

Ich dachte an Atoi, aber ich war besorgt über Segmentierungsfehler, weil ich auf dieses Problem stieß, als ich ein kleines Programm auf Ubuntu schrieb. Es heißt Segmentierungsfehler (Core Dumped). Ist es also sicher atoi zu benutzen? – cscoding

+0

Es ist immer ratsam, eine Datenüberprüfung durchzuführen, wenn Sie ein Programm schreiben, das Eingaben von einem Benutzer entgegennimmt. 'atoi' nimmt einen C-String (dh ein nullterminiertes Array von Zeichen) als Parameter. Wenn Sie die Eingabe überprüfen und überprüfen, ob das, was an atoi() übergeben wird, gültig ist, sollten Sie in Ordnung sein. – Andrew

+0

Sie können auch 'strtol()' verwenden, um eine Zeichenfolge in einen ganzzahligen Wert zu konvertieren. – Andrew