重新创建 strstr()
Recreating strstr()
我的目标是在名为 myStrStr
的 C 函数中重新创建 strstr
,如果在大海捞针中找到子字符串 returns 和 [=15] =] 如果不是,则一直将匹配的子字符串复制到缓冲区中。
我尝试编写以下代码来解决这个问题,但我不确定为什么它在编译时没有产生预期的结果 运行。
int myStrStr(char *haystack, char *needle, char *buffer) {
int i = 1;
char *k = (haystack + i);
for (; *haystack != '[=10=]'; haystack++) {
if (*haystack == *needle) {
buffer[0] = *haystack;
for (; *needle != '[=10=]'; needle++) {
if (*needle = *k) {
buffer[i] = *k;
i++;
printf("%d\n", i);
} else
if (strlen(buffer) == strlen(needle)) {
return 1;
} else {
buffer[0] = 0;
}
}
}
}
return 0;
}
驱动代码示例如下:
int myStrStr(char[], char[], char[]);
char haystack[][20] = { "chocolate", "vanilla", "caramel", "strawberry", "banana", "cherry" };
char needle[][20] = { "choc", "lla", "am", "strawberry", "na", "terrible" };
char buffer[255];
printf("\n\t=========Test #1: myStrStr with '%s' and substring '%s'===========\n\n", haystack[0], needle[0]);
int result = myStrStr(haystack[0],needle[0],buffer);
assert(result == 1&& strcmp(needle[0], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Test #2: myStrStr with '%s' and substring '%s'===========\n\n", haystack[1], needle[1]);
result = myStrStr(haystack[1],needle[1],buffer);
assert(result == 1 && strcmp(needle[1], buffer) == 0);
printf("\n\t\t....Test Passed\n");
谢谢
该功能在多个方面被破坏。
这是更正后的版本:
int myStrStr(const char *haystack, const char *needle, char *buffer) {
if (*needle == '[=10=]') {
/* special case for empty needle: return success with an empty match */
buffer[0] = '[=10=]';
return 1;
}
for (; *haystack != '[=10=]'; haystack++) {
if (*haystack == *needle) {
buffer[0] = *haystack;
for (size_t i = 1;; i++) {
buffer[i] = needle[i];
if (needle[i] == '[=10=]')
return 1;
if (needle[i] != haystack[i])
break;
}
}
}
buffer[0] = '[=10=]';
return 0;
}
请注意,扫描时复制匹配的字符串是不必要的,找到匹配项后复制针就足够了。事实上,buffer
的内容要么是一个空字符串,要么是 needle
的副本:这不是一个非常有用的副作用。
我的目标是在名为 myStrStr
的 C 函数中重新创建 strstr
,如果在大海捞针中找到子字符串 returns 和 [=15] =] 如果不是,则一直将匹配的子字符串复制到缓冲区中。
我尝试编写以下代码来解决这个问题,但我不确定为什么它在编译时没有产生预期的结果 运行。
int myStrStr(char *haystack, char *needle, char *buffer) {
int i = 1;
char *k = (haystack + i);
for (; *haystack != '[=10=]'; haystack++) {
if (*haystack == *needle) {
buffer[0] = *haystack;
for (; *needle != '[=10=]'; needle++) {
if (*needle = *k) {
buffer[i] = *k;
i++;
printf("%d\n", i);
} else
if (strlen(buffer) == strlen(needle)) {
return 1;
} else {
buffer[0] = 0;
}
}
}
}
return 0;
}
驱动代码示例如下:
int myStrStr(char[], char[], char[]);
char haystack[][20] = { "chocolate", "vanilla", "caramel", "strawberry", "banana", "cherry" };
char needle[][20] = { "choc", "lla", "am", "strawberry", "na", "terrible" };
char buffer[255];
printf("\n\t=========Test #1: myStrStr with '%s' and substring '%s'===========\n\n", haystack[0], needle[0]);
int result = myStrStr(haystack[0],needle[0],buffer);
assert(result == 1&& strcmp(needle[0], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Test #2: myStrStr with '%s' and substring '%s'===========\n\n", haystack[1], needle[1]);
result = myStrStr(haystack[1],needle[1],buffer);
assert(result == 1 && strcmp(needle[1], buffer) == 0);
printf("\n\t\t....Test Passed\n");
谢谢
该功能在多个方面被破坏。
这是更正后的版本:
int myStrStr(const char *haystack, const char *needle, char *buffer) {
if (*needle == '[=10=]') {
/* special case for empty needle: return success with an empty match */
buffer[0] = '[=10=]';
return 1;
}
for (; *haystack != '[=10=]'; haystack++) {
if (*haystack == *needle) {
buffer[0] = *haystack;
for (size_t i = 1;; i++) {
buffer[i] = needle[i];
if (needle[i] == '[=10=]')
return 1;
if (needle[i] != haystack[i])
break;
}
}
}
buffer[0] = '[=10=]';
return 0;
}
请注意,扫描时复制匹配的字符串是不必要的,找到匹配项后复制针就足够了。事实上,buffer
的内容要么是一个空字符串,要么是 needle
的副本:这不是一个非常有用的副作用。