C 这个搜索功能看起来好吗?
我是C语言的新手,所以我已经玩了一段时间,并提出了这个搜索函数,我计划将其转换为搜索和替换函数。我确信它是有效的,因为我一直在用大量输入测试它,并且总是得到相应数量的“Word found!”打印C 这个搜索功能看起来好吗?,c,string,search,C,String,Search,我是C语言的新手,所以我已经玩了一段时间,并提出了这个搜索函数,我计划将其转换为搜索和替换函数。我确信它是有效的,因为我一直在用大量输入测试它,并且总是得到相应数量的“Word found!”打印 void searchString(){ char message[]=“这是一个测试消息test test”; char wordToFind[]=“消息”; int i=0; 对于(i=0;i没有用魔法找到长度。它必须扫描每个字符以找到尾随的null。这是一个O(n)算法。如果迭代每个字符并调用s
void searchString(){
char message[]=“这是一个测试消息test test”;
char wordToFind[]=“消息”;
int i=0;
对于(i=0;i
我的问题是,这是有效的还是有更好的方法在C中实现这一点?函数中存在多个问题:
- 当检测到不匹配时,您会将
增加两次,因此在i
中找不到
,这是一个测试消息测试消息
- 您需要对字符串长度进行硬编码。使用
只能用于编译时已知的字符串,因此您的函数根本不是泛型函数。相反,您应该编写一个函数,该函数使用2个指向C字符串的指针,并谨慎地使用sizeof()
,或者检查循环中的空终止符strlen()
void searchString(const char *message, const char *wordToFind) {
int i = 0;
for (i = 0; message[i] != '\0'; i++) {
if (message[i] == wordToFind[0]) {
int i2 = 0;
for (i2 = 1; wordToFind[i2] != '\0'; i2++) {
if (message[i + i2] != wordToFind[i2]) {
break;
}
}
if (wordToFind[i2] == '\0') {
printf("Word found at offset %d\n", i);
}
}
}
}
注:
- 函数不处理空
的特殊情况wordToFind[]
- 就效率而言,使用标准库函数
可能会更有效,因为它可能以非常高效的方式实现strstr()
strstr()
的替代方法:
第一印象是压痕的层次太多了。根据经验,如果有三个以上,请重写代码。还要注意的是,如果传递一个指针,
sizeof
将给出令人惊讶的结果。我想你的意思是斯特伦。谢谢,我看着它,也在想同样的事情。我觉得我可以找到一种方法来消除第二个for循环。啊,读一下strlen(),这看起来更像是我想用的东西。这是行不通的,因为你要将I
的值增加两次,假设message
的值等于“mmessage”和 WordFoFunt等于“消息”,然后该代码输出错误的答案。如果你想更好地搜索子串,那么考虑一个完全不同的算法,就像它值得指出的,<>代码> StLLIN < /Cord>没有用魔法找到长度。它必须扫描每个字符以找到尾随的null。这是一个O(n)算法。如果迭代每个字符并调用strlen()
每次迭代,那么就得到了一个O(n^2)算法。chqrlie通过检查尾部null所做的工作要好得多。如果n和m是message和wordToFind的长度,那么他的代码是O(nm),而使用strlen()每次迭代都是O(n^2m^2)。(除非编译器足够聪明,可以将strlen()优化为循环不变量)。@TrentP:我修改了关于使用strlen()
的答案。请注意,如果单词tofind
具有与消息的大部分匹配的长前缀,则复杂性的最坏情况为O(n.m),但平均情况仅略大于O(n)。
void searchString(const char *message, const char *wordToFind) {
int i = 0;
for (i = 0; message[i] != '\0'; i++) {
if (message[i] == wordToFind[0]) {
int i2 = 0;
for (i2 = 1; wordToFind[i2] != '\0'; i2++) {
if (message[i + i2] != wordToFind[i2]) {
break;
}
}
if (wordToFind[i2] == '\0') {
printf("Word found at offset %d\n", i);
}
}
}
}
void searchString(const char *message, const char *wordToFind) {
for (const char *p = message; (p = strstr(p, wordToFind)) != NULL; p++) {
printf("Word found at offset %d\n", (int)(p - message));
if (*p == '\0') { /* handle special case of empty wordToFind */
break;
}
}
}