gpt4 book ai didi

C strcmp 行为异常

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:19 24 4
gpt4 key购买 nike

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

我试图找到一个字符串在另一个字符串中的第一次出现(就像 C++ 中的 InString() 一样),但是是从 C 中使用 strcmp() 来完成的。

我有两个字符数组,string[] 和 toFind[],我在两个 for() 循环中遍历它们,将每个字符与 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要比较 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;
}

该函数返回子字符串的起始索引(如果找到)和 -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;
}

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

string[strcspn(string, "\n")] = '\0';
toFind[strcspn(toFind, "\n")] = '\0';

关于C strcmp 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com