2016-05-21 10 views
-1

wenn ich einen boolean Prototyp, wie bool repeat(const char *S, char *P) und ich möchte S für die gleiche Sequenz wie P, & return true, wenn es eine Übereinstimmung gibt, zum Beispiel suchen:boolean Cschnur Sequenz - Berichterstattung eine Übereinstimmung

char *this = "ABCDEFGH"; 
bool found; 
found = count(this, "DEF"); // will be true 
found = count(this, "FED"); // will be false 

Meine aktuelle naive Lösung ist

bool count (const char *S, char *P){ 
bool found; 
int i = 0; 
if (S[0] = P[0] && S[1] = P[1] && S[2] = P[2]) found = true; 
else i + 1; 

kann ich die Syntax S verwenden Sie [0 + i] und so weiter, weiter in dem Array zu suchen, wenn das erste Element nicht gewachsen ist?

Jeder Einblick wird geschätzt. Vielen Dank.

+0

'char * this =" ABCDEFGH ";'? Ist das überhaupt legal? – IInspectable

+0

@Intspectable Ja ist es. Siehe [diesen Beitrag.] (Http://programmers.stackexchange.com/questions/249554/assigning-strings-to-pointer-in-c) –

+0

@AhmedAkhtar: Diese Frage betrifft jedoch [Tag: C++], und 'this' ist ein reserviertes Schlüsselwort. – IInspectable

Antwort

3

Zunächst müssen Sie die

if (S[0] = P[0] && S[1] = P[1] && S[2] = P[2]) 

dieser

if (S[0] == P[0] && S[1] == P[1] && S[2] == P[2]) 

Zustand ändern, weil Sie nicht den Gleichheitsoperator in der ersten verwenden. Es ist Zuweisungsoperator, gibt nicht wahr oder falsch zurück. Ordnet nur den Wert des zweiten Objekts dem ersten zu.

Wenn Sie nur 'size of 3 array' im zweiten suchen, funktioniert dieser Code nach der Korrektur des Gleichheitsoperators.

1

Dies ist C++, und als solche können Sie std::string verwenden. Die Verwendung von std::string hat mehrere Vorteile.

Einer von ihnen ist der eingebaute in std::string::find Methode, die Sie sehen können, ob ein String ein anderes enthält:

bool search(const std::string& S, const std::string& P) 
{ 
    return S.find(P) != std::string::npos; 
} 
0

Zum einen == zum Vergleich anstelle von =, die für die Zuordnung ist.

Zweitens nicht this als Variablenname verwenden, da es ein reserviertes Schlüsselwort ist.

Drittens, für eine solche Anpassung müssen Sie durchlaufen die beiden char Arrays, und dafür müssen Sie zuerst ihre Größen finden.

Da Strings in c '\0' terminiert sind, verwenden Sie die strlen-Funktion von string.h, um die Größe einer Zeichenfolge zu finden.

#include <string.h> 
bool count (const char *S, char *P) 
{ 
int sizeS = strlen(S); 
int sizeP = strlen(P); 

bool found = false; 

int i,j; 

for(i = 0; i < sizeS; i++) 
{ 
    if (S[i] == P[0])// step1: find first character of P in S 
    { 
    for(j = 1; j < sizeP; j++)// step2: first has matched, look for the rest 
    { 
    if(S[i+j] != P[j])// if any of the rest does not match, go on to step1 
    { 
    break; 
    } 
    } 
    if(j == sizeP)// if all matched, j's loop did not break 
    { 
    found = true; 
    break; 
    } 
    } 
} 
return found; 
} 

Hinweis: Ich habe versucht, diesen Code zu arbeiten.

+0

'S' und' P' sind keine Arrays. Sie sind Zeiger. Der Ausdruck 'sizeof (S)/sizeof (S [0])' gibt nicht die Array-Größe (oder String-Länge) zurück. Außerdem gibt der Operator 'sizeof' eine Konstante vom Typ' std :: size_t' zurück, nicht 'int'. – IInspectable

+0

Ja richtig, ich musste 'strlen' verwenden. Habe das jetzt gemacht. –