2016-06-25 3 views
1

So habe ich eine Zeichenfolge als einen Satz definiert mit seinen Leerzeichen durch "*" ersetzt. Zum Beispiel:Suchen eines Wortes in einer Zeichenfolge, die nur die Bibliotheken Iostream und Cstring verwendet

suffix*i*am*using*stackoverflow*text1suffix*text2suffix 

Das erste Wort des Satzes ist das 'Suffix'. Was ich tun muss, ist, den Satz in verschiedene Wörter mit strtok zu trennen und dann jedes Wort zu drucken, das in dem Suffix endet. Der Ausgang wäre die folgende:

text1suffix, text2suffix 

Der schwierige Teil ist, dass ich dies durch die Verwendung Bibliotheken nur tun müssen, Iostream und cstring.

Dies ist mein Code:

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() { 
    char s[256], t[256], *p, l, ok; 

    strcpy(s, "suffix*i*am*using*stackoverflow*text1suffix*text2suffix"); 
    p = strtok(s, "*"); 
    strcpy(t, p); 
    l = strlen(p); 
    p = strtok(NULL, "*"); 

    while(p) { 
     ok = 1; 
     for(int i = strlen(p)-1; i >= 0; i--) { 
      if(l-(strlen(p)-i) > 0) {} else break; 
      if(p[i] == t[l-(strlen(p)-i)]) { } 
      else { ok = 0; break; } 
     } 
     if(ok == 1) cout << "*" << p; 

     p = strtok(NULL, "*"); 
    } 
    return 0; 
} 

Was ich tat, ist jedes einzelne Zeichen überprüfen (vom letzten Start) und prüfen, ob sie die gleichen wie in dem ersten Wort sind.

Die Frage ist: Gibt es irgendeine Möglichkeit, die ich mit weniger Aufwand tun könnte? Oder gibt es eine andere Möglichkeit, dieses Problem zu lösen? Ich habe das Gefühl, dass meine Methode nicht gut ist.

+2

'strcmp' könnte hilfreich sein – tkausl

+0

Können Sie mir bitte ein Beispiel geben? – Radu

+0

[hier ist es] (http://en.cppreference.com/w/c/string/byte/strcmp) –

Antwort

0

Die Frage ist: Gibt es irgendeine Möglichkeit, die ich mit weniger Aufwand tun könnte?

Zuerst empfehle ich Ihnen, bessere Namenskonventionen für Ihre Variablen zu verwenden. Namen wie l und t beschreiben nicht, was sie darstellen. Etwas wie folgt aus:

char *suffix = strtok(s, "*"); 
int suffixLength = strlen(suffix); 

In Bezug auf Ihre innere for Schleife, gibt es keine Notwendigkeit, eine solche Schleife zu schreiben, da die strstr Funktion die Arbeit der Suche nach einer Zeichenkette in einem String tut.

char *found = strstr(p, suffix);

Ist dies nicht NULL zurückkehrt, dann können Sie testen, um zu sehen, ob das Zeichen über den gefundenen "suffix" String ist ein Null-Terminator, da Sie mit null zu tun haben terminierten Strings. Wenn das Zeichen nach dem gefundenen Suffix nicht \0 ist, dann wissen Sie, dass die Zeichenfolge nicht in der Suffixzeichenfolge endet.

if (found && *(found + suffixLength) == '\0') // the suffix must be found, and it must occur at the end of the string. 
{ 
    // ends with the suffix string. 
} 

Darüber hinaus rufen Sie strlen mehrere Male auf dem gleichen char buffer. Das ist sehr verschwenderisch.

Angesichts dieser Informationen sollten Sie in der Lage sein, eine "bessere" Schleife ohne unnötige Anrufe zu strlen zusammenzustellen.

Verwandte Themen