我是C的新手,所以我一直在玩它,并提出了这个搜索功能,我计划进入搜索和替换功能。我确信它有效,因为我一直在用一堆输入进行测试,总是得到相应数量的“找到的单词!”打印。
void searchString() {
char message[] = "This is a test message test test";
char wordToFind[] = "message";
int i = 0;
for (i = 0; i < sizeof(message) - 1; i++) {
if (message[i] == wordToFind[0]) {
int i2 = 0;
for (i2 = 1; i2 < sizeof(wordToFind) - 1; i2++) {
if (message[i + i2] != wordToFind[i2]) {
i++;
break;
}
if (i2 == sizeof(wordToFind) - 2) {
printf("Word found!\n");
break;
}
}
}
}
}
我的问题是,这有效还是有更好的方法在C中执行此操作?
答案 0 :(得分:1)
您的功能存在多个问题:
i
两次,因此您在message
中找不到This is a test mmessage test test
。sizeof()
只能用于编译时已知的字符串,因此您的函数根本不是通用的。您应该编写一个函数,该函数需要2个指向C字符串的指针并谨慎使用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()
的替代方案:
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;
}
}
}