2017-05-08 5 views
-1

Ich habe ein Problem mit meinem Code. Ich muss strtok() in c verwenden, um die Wörter "Sing" und "Toy" (die beide zwischen den Wörtern "Due" und "De" stehen) in der Zeichenfolge "Date WEEk Dae Due Toy De Dae I Date Due Sing De ". Ich habe versucht, die if-Anweisung im Code zu verwenden, um explizit die Wörter "Sing" und "Toy" auszugeben, aber mein Code würde keine Ausgabe erzeugen, und er hatte keine Warnungen während der Kompilierung. Ich bin nur ein Anfänger bei C, also bitte habe Geduld mit mir. Ich habe gehört, dass andere Funktionen wie strstr() in der Lage sein könnten, den gleichen Job wie strtok() zu machen, also wenn diese anderen Funktionen viel bequemer zu verwenden sind, zögern Sie nicht, stattdessen diese Funktionen zu verwenden. Vielen Dank. Zusammenfassung: Ich versuche, die Wörter zwischen "Due" und "De" in der obigen Zeichenfolge mit Strtok() zu bekommen und ist es möglich, oder sollte ich eine andere Funktion verwenden?Wie man strtok benutzt, um ein Wort zu bekommen

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(){ 
char string[]="Date WEEk Dae Due Toy De Dae i Date Due Sing De"; 
char*pch; 
pch=strtok(string,"De"); 

while(pch!=NULL){ 
    if((*(pch-1)=='a')&&(*(pch-2)=='u')) 
    printf("%s\n",pch); 

    pch=strtok(NULL,"De"); 
} 
return 0; 
} 
+0

Einrückungen ........................... – ThingyWotsit

+0

Was für 'Durch das Ergebnis ist Sing Song De'? 'Sing' oder' Sing Song' oder Das trifft nicht zu? – BLUEPIXY

Antwort

0

Sie sollten "" als zweites Argument

strtok Wenn Sie singen ausdrucken möchten, prüfen Sie, ob pch nicht null und strcmp ist (pch, "pass singen") == 0, dann drucken Singen

+0

Ist dies für die erste, zweite oder beide Instanzen von strtok, die "" als zweites Argument haben sollte? – Antonio

0

Find "Due" gefolgt von einem Leerzeichen

char *due = strstr(string, "Due "); 

finden "De" vorangestellt von einem Leerzeichen

char *de = strstr(string, " De"); 

prüfen Fehler

if (!due || !de) exit(EXIT_FAILURE); 

drucken, was zwischen

printf("%.*s\n", (int)(de - due - 4), due + 4); 
+0

Ich habe deine Lösung versucht, aber ich habe nur "Toy" anstelle von "Toy" und "Sing" bekommen. – Antonio

+0

Ich benutzte auch eine Schleife mit Zähler, aber ich bekam auch nur "Toy". – Antonio

+0

@Antonio Ab dem zweiten Mal müssen Sie mit nach "de" beginnen. – BLUEPIXY

1

zu Beachten ist, dass der zweite Parameter von strtok() ist eine delimeter Liste:

C-String mit dem Begrenzer Figuren. Diese können sich von Anruf zu Anruf unterscheiden.

So wie es jetzt in Ihrem Code ist, wird der Token nach jedem Großbuchstaben D und Kleinbuchstaben e genommen. Für den in Ihrer Beschreibung erwähnten Fall ist es besser, das Problem mit strstr() zu umgehen.

0

Verwenden strstr wie dieses

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int main(void){ 
    char string[]="Date WEEk Dae Due Toy De Dae i Date Due Sing De"; 
    char *pre_word = "Due", *post_word = "De"; 
    size_t pre_word_len = strlen(pre_word), post_word_len = strlen(post_word); 
    char *p = string, *pre, *post; 

    while(pre = strstr(p, pre_word)){//find pre word 
     if((pre == string || isspace((unsigned char)pre[-1])) && 
      isspace((unsigned char)pre[pre_word_len])){//word check 
      if(post = strstr(pre + pre_word_len, post_word)){//find post word 
       if(isspace((unsigned char)post[-1]) && 
        (isspace((unsigned char)post[post_word_len]) || !post[post_word_len])){//word check 
        *post = 0;//The original string is changed 
        char word[32], dummy[2]; 
        if(1==sscanf(pre + pre_word_len, "%31s %1s", word, dummy)){//There is one word between words 
         printf("'%s'\n", word); 
        } 
       } 
       p = post + post_word_len;//set next search position 
      } else { 
       break;//Since post_word does not exist, it ends loop. 
      } 
     } 
    } 
    return 0; 
} 
+0

[DEMO] (http://ideone.com/oDp9Ch) – BLUEPIXY

Verwandte Themen