Хорошо, я не уверен, что это я или что-то еще, но я действительно запутался.
Я пытаюсь найти первое вхождение строки внутри другой строки (так же, как InString() из C++), но из C и делаю это с помощью strcmp().
У меня есть два массива char, string[] и toFind[], и я просматриваю их в двух циклах for(), сравнивая каждый char с strcmp().
Вот код:
int inString(char string[], char toFind[]){
int i_toFind, i_string, check = 0, start = -1;
for(i_toFind = 0; i_toFind < getLength(toFind)-1; i_toFind++){
for(i_string = 0; i_string < getLength(string)-1; i_string++){
if(strcmp(&string[i_string], &toFind[i_toFind])==0){
printf("%i & %i == %i\n", string[i_string], toFind[i_toFind], strcmp(&string[i_string], &toFind[i_toFind]));
if(start == -1){
start = i_string;
}
check++;
i_toFind++;
if(check == getLength(toFind)-1){
return start;
}
}
else{
printf("%i & %i == %i\n", string[i_string], toFind[i_toFind], strcmp(&string[i_string], &toFind[i_toFind]));
check = 0;
start = -1;
}
}
}
return -1;
}
Теперь это работает, например, для этих значений:
string[] = "hello my friend"
toFind[] = "friend"
result:
104 & 102 == 2
101 & 102 == -1
108 & 102 == 6
108 & 102 == 6
111 & 102 == 9
32 & 102 == -70
109 & 102 == 7
121 & 102 == 19
32 & 102 == -70
102 & 102 == 0
114 & 114 == 0
105 & 105 == 0
101 & 101 == 0
110 & 110 == 0
100 & 100 == 0
Но для этого не работает:
string[] = "friday friend comes"
toFind[] = "friend"
result:
102 & 102 == -1
114 & 102 == 12
105 & 102 == 3
100 & 102 == -2
97 & 102 == -5
121 & 102 == 19
32 & 102 == -70
102 & 102 == 22
114 & 102 == 12
105 & 102 == 3
101 & 102 == -1
110 & 102 == 8
100 & 102 == -2
32 & 102 == -70
99 & 102 == -3
111 & 102 == 9
109 & 102 == 7
101 & 102 == -1
115 & 102 == 13
102 & 114 == -12
114 & 114 == -1
105 & 114 == -9
...
Интересная часть заключается в следующем:
102 & 102 == -1
114 & 114 == -1
Не должно ли это быть 0 при равенстве? Или что мне здесь не хватает? Функция, которую я написал, кажется, терпит неудачу только в том случае, если слово, которое я ищу, НЕ является последним в строке [].
Надеюсь, кто-то действительно найдет мою ошибку.. Спасибо!
ОБНОВИТЬ:
Код, в котором я запускаю InString(), состоит только из одной строки:
printf("Beginn: %i\n", inString(string, substring));
ОБНОВЛЕНИЕ 2:
Вот простой пример проблемы:
int inString(char string[], char toFind[]){
const char *pointer_toStart = strstr(string, toFind);
return pointer_toStart ? pointer_toStart - string : -1;
}
int main(int argc, const char * argv[]) {
char string[300], substring[300];
printf("String: ");
fgets(&test, 20, stdin); // To capture the one '\n' inside the buffer (just ignore this line)
fgets(string, 300, stdin);
printf("toFind: ");
fgets(substring, 300, stdin);
printf("Beginn: %i\n", inString(string, substring));
}
strcmp
для сравнения отдельных символов. - person Oliver Charlesworth   schedule 22.11.2015getLength
наstrlen
? - person Alexguitar   schedule 22.11.2015strstr()
? Если вы пытаетесь реализоватьstrstr()
, неясно, является лиstrcmp()
полезной функцией; вы могли бы использоватьstrncmp()
, но даже это, скорее всего, будет проблематичным, чем выполнение работы с символами, а не со строками. - person Jonathan Leffler   schedule 22.11.2015strstr()
, является указателем на начало первого вхождения строки «игла» в строку «стог сена» или нулевым указателем, если игла не найдена в стоге сена. Если вам нужно смещение до начала строки, тоretval - start
дает вам нужное число. - person Jonathan Leffler   schedule 22.11.2015