好吧我不确定这是不是我还是别的什么,但我真的很困惑。
我试图在另一个字符串中找到第一个字符串出现(就像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吗?或者我在这里失踪了什么? 如果单词im search不是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));
}
答案 0 :(得分: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;
}
该函数返回子字符串的起始索引(如果找到),-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';
答案 1 :(得分:0)
好的,首先非常感谢chqrlie帮助我这么多,并指出了我正确的方向。
我尝试了你提到的内容,删除了字符串[]和toFind []中的'\ n',但我仍然以相同的问题结束。
为我解决的是使用我在开头发布的方法,而不是使用memcmp()而不是strcmp()。这样做了。所以这是我的inString()现在的样子:
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); i_string++){
if(memcmp(&string[i_string], &toFind[i_toFind], 1)==0){
if(start == -1){
start = i_string;
}
check++;
i_toFind++;
if(check == getLength(toFind)-1){
return start;
}
}
else{
i_toFind = i_toFind - check;
check = 0;
start = -1;
}
}
}
return -1;
}
在上面提到的例子中也给了我25个。