C strcmp表现得很奇怪

use*_*602 0 c compare char strcmp

好吧,我不确定这是我还是其他什么,但我真的很困惑.

我试图在另一个字符串中找到第一个字符串出现(就像C++中的InString()),但是从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;

}
Run Code Online (Sandbox Code Playgroud)

现在这适用于此值:

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
Run Code Online (Sandbox Code Playgroud)

但是这样做不起作用:

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
...
Run Code Online (Sandbox Code Playgroud)

有趣的是这个:

102 & 102 == -1
114 & 114 == -1
Run Code Online (Sandbox Code Playgroud)

当相等时,这不应该是0吗?或者我在这里失踪了什么?如果单词im搜索不是string []中的最后一个,我写的函数似乎只会失败.

希望有人能找到我的错误..谢谢!

更新:

我运行InString()的代码只有一行:

printf("Beginn: %i\n", inString(string, substring));
Run Code Online (Sandbox Code Playgroud)

更新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));

}
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 5

您不能strcmp用来比较C字符串的部分,您可以使用memcmp它.但是使用的问题有一个更简单的方法strstr.

根据您的隐式规范,这是inString的简单实现.

#include <string.h>

int inString(const char *string, const char *toFind) {
    const char *p = strstr(string, toFind);
    return p ? p - string : -1;
}
Run Code Online (Sandbox Code Playgroud)

如果找到并且-1未找到,则该函数返回子字符串的起始索引.

通过此实现,以下测试正确打印25:

#include <stdio.h>

int main(void) {
    char string[] = "Friede freude Eierkuchen freuen sich freundlich";
    char toFind[] = "freuen";

    printf("inString(\"%s\", \"%s\") -> %d\n", string, toFind, inString(string, toFind));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在测试代​​码中,您使用fgets从标准输入读取字符串.两个字符串都可能包含一个final '\n',因此你找不到匹配项,"freuen\n"除非它在最后string还有一个final '\n'.通过删除来纠正此问题'\n'.这是一种剥离它的简单方法,如果它不存在也可以工作:

string[strcspn(string, "\n")] = '\0';
toFind[strcspn(toFind, "\n")] = '\0';
Run Code Online (Sandbox Code Playgroud)