【发布时间】:2015-11-22 16:41:47
【问题描述】:
好吧,我不确定这是我还是其他人,但我真的很困惑。
我试图找到一个字符串在另一个字符串中的第一次出现(就像 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;
}
现在这适用于这个值:
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 吗?或者我在这里错过了什么? 如果我正在搜索的单词不是 string[] 中的最后一个单词,我编写的函数似乎只会失败。
希望有人能真正找到我的错误.. 谢谢!
更新:
我运行 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 字符串函数,为什么不将
getLength替换为strlen? -
strstr() 可能是要使用的。
-
您确定不想要
strstr()吗?如果您尝试实现strstr(),则不清楚strcmp()是否有用;您也许可以使用strncmp(),但即使这样也比在字符而不是字符串上执行工作更有可能出现问题。 -
getLength() 使用的是strlen,所以基本一样。我没有使用 strstr() 因为那给了我一个指针对吗?我如何从中获取搜索字符串的起始位置?