2013-10-04 3 views
0

Im пытается написать функцию, которая возвращает индекс первого появления подстроки внутри строки.неверный счет с использованием strstr

как поиск небоскреба для «СМ» вернется 2.

Похоже, strstr делают свою работу, потому что после того, как время цикла она выводит правильный первый символ подстроки, но оно не считая правильно и возвращение правильного внутр.

Возможно, это неправильно настроено, поскольку я передаю массив функции и получил много ошибок, пытающихся использовать вложенные циклы, поэтому я попытался использовать цикл while, который компилирует, но не выводит правильно.

Я все еще довольно новичок в указателях и передаю их в качестве аргументов, поэтому там может быть проблема.

все, что угодно!

int findSubstring(char *s, char substring[]) 
{ 
    int j = 1; 
    char* strPtr = NULL; 

    while (strPtr == NULL) 
    { 
     strPtr = strstr(s, substring); 
     if (strPtr != NULL) 
      break; 
     j++; 
    } 

    cout << *strPtr << endl; 
    cout << "The substring begins at element: " << j << endl; 
    return j; 
} 

ответ

0

Как насчет использования только указательной арифметики?

int findSubstring(char *s, char substring[]) 
{ 
    char* strPtr = strstr(s, substring); 
    if (strPtr != NULL) 
    { 
     return (int)(strPtr - s); 
    } 
    else 
    { 
     return -1; //no match 
    } 
} 
+0

return (int) (strPtr - s); Не могли бы вы объяснить мне эту строку? Этот код работает именно так, как я этого хочу, но я хотел бы знать, почему я его использую! –

+0

Указатели символов содержат адреса символов. Принимая разницу в двух указателях символов, вы узнаете, сколько персонажей вы перемещаете, переходя от одного к другому. Поскольку 'strPtr' указывает на один из символов в' s', он сообщает вам количество символов * в этой строке *, которое вы прошли. Отбрасывая разницу в целое число, убедитесь, что ваш тип возвращаемого значения верен. – John

+0

Спасибо, часть каста показалась очевидной, но я не получил вычитание указателя. Теперь это имеет смысл. –

0

Вы, кажется, более усложняет задачу, так как вы используете C++ вы должны использовать std::string::find.

std::string s = "skyscraper"; 
std::size_t pos = s.find("ysc"); 
if(pos != std::string::npos) 
    std::cout << "ysc found at " << pos << "\n"; 
else 
    std::cout << "ysc not found" << "\n"; 
0

Fix ваш, как, обратитесь this example:

int findSubstring(char *s, char substring[]) 
{ 
    char* pos = strstr(s, substring); 
    if(pos) 
    return (int)(pos - s); 
    else -1; 
} 

И вы используете C++, поэтому, почему бы не std::string?

int findSubstring(const std::string& s, const std::string& substring) 
{ 

std::size_t j =s.find(substring); 
return (j!=std::string::npos) ? j :-1; 
} 
+0

return (int) (поз.); Не могли бы вы объяснить, как работает эта линия? также им совершенно незнакомо с использованием std: :(​​ничего), но я вижу это много и чувствую, что я должен изучить этот синтаксис вместо этого. –

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