2016-05-21 2 views
-1

если я булев прототип, такой, как bool repeat(const char *S, char *P) , и я хочу, чтобы найти S для одной и той же последовательности, как P, & возвращения истинного, если есть совпадение, например:булевой строка-си последовательность - репортаж матча

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

Мой текущий наивным решение

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; 

могу ли я использовать синтаксис S [0 + I] и так далее, чтобы продолжать смотреть в массив, если первый член не матч?

Любое понимание оценено. Благодарю.

+0

'char * this =" ABCDEFGH ";'? Это даже законно? – IInspectable

+0

@ Необычный Да. См. [Этот пост.] (Http://programmers.stackexchange.com/questions/249554/assigning-strings-to-pointer-in-c) –

+0

@AhmedAkhtar: Этот вопрос касается [tag: C++], хотя и 'this' является зарезервированным ключевым словом. – IInspectable

ответ

3

Во-первых, вы должны изменить условие

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

к этому

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

Поскольку вы не используете оператор равенства в первом. Это оператор присваивания, не возвращает true или false. Просто присваивает значение второго объекта первому.

Если вы только ищите «размер 3 массива» во втором, этот код будет работать после фиксации оператора равенства.

1

Это C++, и поэтому вы можете использовать std::string. Использование std::string имеет несколько преимуществ.

Одним из них является встроенным std::string::find метода, который вы можете использовать, чтобы увидеть, если строка содержит еще одно:

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

== Во-первых использовать для сравнения вместо =, что для назначения.

Во-вторых, не используйте this как имя переменной, так как это зарезервированное ключевое слово.

В-третьих, для такого соответствия вам необходимо пройти через массивы char, и для этого вам сначала нужно будет найти их размеры.

Поскольку строки в c: '\0' завершены, используйте функцию strlenstring.h, чтобы найти размер строки.

#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; 
} 

Примечание: Я пробовал использовать этот код.

+0

'S' и' P' не являются массивами. Это указатели. Выражение 'sizeof (S)/sizeof (S [0])' не возвращает размер массива (или длину строки). Кроме того, оператор 'sizeof' возвращает константу типа' std :: size_t', а не 'int'. – IInspectable

+0

Да, я должен был использовать 'strlen'. Сделал это сейчас. –

Смежные вопросы