2009-05-09 3 views
2

С учетом 2 строк напишите функцию, которая возвращает позицию String B, которая соответствует строке A, если String A является подстрокой строки B. В противном случае возвращает -1. Пример:Подстройка экстракции подстроки

strA = "ello" 
strB = "Hello_World" 
Your function should return 1. 

strA = "blah" 
strB = "blha" 
Your function should return -1. 
+1

Как я вижу, только вопросы, сделанные гением, принимаются здесь! Почему все так грубы с новичками? – backslash17

+1

Не заставляйте других людей выполнять домашнее задание. Вы не узнаете, чему должны учиться, если не делаете этого сами. – lothar

+1

Потому что это не HomeworkOverflow. Вам не обязательно быть гением, но вам не нужно пытаться обманывать домашнюю работу и прилагать определенные усилия для решения проблемы самостоятельно – Yuliy

ответ

2

Brute версия силы:

int strpos(char* a, char* b) { 
    int n1, n2, i, j; 
    n1 = strlen(a); 
    n2 = strlen(b); 
    for (i = 0; i < n1-n2; i++) { 
    for (j = 0; j < n2; j++) { 
     if (a[i+j] != b[j]) break; 
     else if (j+1 == n2) return i; 
    } 
    } 
    return -1; 
} 

Более эффективные алгоритмы: Wikipedia: String searching

+2

Если вы собираетесь использовать string.h в любом случае (или, действительно, даже если это не так), почему это так много? Кроме того, делая шаг вперед, вы теряете большую часть своей выгоды от выхода из цикла. –

+0

Просто, чтобы показать, как это можно сделать. –

+0

Да, но, как я уже сказал, это наивная реализация, из-за того, что между прочим. –

3

Это домашнее задание? В любом случае, посмотрите string.h documentation, и вы должны найти то, что вам нужно, без особых проблем. Вам нужно будет написать очень тонкую оболочку над одной из функций. Или, конечно, вы можете просто написать все сами.

EDIT: Ну, кто-то дал ответ, так что вот моя попытка.

#include <string.h> 

ssize_t str_index(const char *strA, const char *strB) 
{ 
    const char *result; 
    return (result = strstr(strB, strA)) ? (result - strB) : -1; 
} 

Единственные трюки, что параметр порядка противоположен strstr, вы возвращаете SSIZE_T вместо полукокса *, а код ошибки, таким образом, -1.

+0

Просто хотел сказать, что вы доверяете strstr(), чтобы иметь «приятную» реализацию, когда это может быть болезненным бедствием. – Tom

+0

И что size_t не имеет знака. Следует использовать ssize_t. – Tom

+0

Хороший улов на ssize_t. Из любопытства кто-нибудь знает, что (если есть), уровень предупреждения улавливает это с помощью gcc? -Wall -Wextra нет. И да, я намеренно доверяю strstr, потому что у меня нет причин не делать этого. –

0

Это звучит почти так же, как проблема домашних заданий. В странном случае, когда это не проблема с домашней работой, функция библиотеки C strstr возвращает указатель на первое вхождение строки внутри другого (или null, если она не существует). Оттуда тривиально определить индекс, используя арифметику указателя.

2
#include <string.h> 

int search(char* a, char* b) { 
    char* pos; 
    pos = strstr(b, a); 
    if(pos == 0) return -1; 
    return (int)(pos-b); 
} 
0

Попытка узнать о strstr. Его доступно в string.h Существует НИКОГДА причина для кода того, что уже доступно в стандартной библиотеке. Если, конечно, вопрос о домашней задаче :)

+0

Это всегда не домашнее задание. Иногда люди пытаются реализовать функцию, чтобы они могли лучше работать с функцией. –

+0

@fahad: достаточно справедливо, но способ, которым ОП задавал свой вопрос, пахнул как домашнее задание –

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