在较大的字符串中查找子字符串的位置
我创建了一个函数,该函数应该在较大的字符串中找到子字符串的第一个字符的数字位置。 我输出有一些问题,我不太清楚为什么。 这些问题包括每次返回-1而不是子串的整数位置。 我已经调试过,无法追踪function出错的地方。
这是函数应该执行的方式:如果我的字符串是“狗很快”而我正在搜索子字符串“dog”,则该函数应返回4.感谢chqrlie对循环的帮助。
这是function:
int findSubString(char original[], char toFind[]) { size_t i, j; int originalLength = 0; int toFindLength = 0; originalLength = strlen(original) + 1; toFindLength = strlen(toFind) + 1; for (i = 0; i < toFindLength + 1; i++) { for (j = 0; j < originalLength + 1; j++) { if (toFind[j] == '\0') { return i; } if (original[i + j] != toFind[j]) { break; } } if (original[i] == '\0') { return -1; } } }
函数参数不能修改,这是一个要求。 任何帮助赞赏!
循环中的这些语句
if (toFind[j] == '\0') { return i; }
导致未定义的行为,因为字符串toFind
可能比字符串original
短。
这个循环同样有效
if (original[i + j] != toFind[j]) { break; }
因为i + j
可以大于original
字符串的长度。
如果要在其中找到子串,则无需扫描字符串original
字符。
您还应该检查字符串original
长度是否不小于字符串toFind
的长度。
如果你只想在字符串toFind
中找到字符串toFind
的第一个字符,那么使用标准的C函数strchr
就足够了。 如果你想在字符串original
找到整个字符串toFind
,那么你可以使用另一个C标准函数strstr
。
如果你想自己编写函数来查找其他字符串中的字符串,那么它可以查找以下方式
我声明了这个函数
long long int findSubString( const char original[], const char toFind[] );
但是你可以像你一样编写你的声明
int findSubString( char original[], char toFind[] );
但在这种情况下你应该声明函数局部变量success
int success = -1;
并使用格式说明符"%d"
而不是"%lld"
输出结果。
这个给你。
#include #include #include long long int findSubString( const char original[], const char toFind[] ) { size_t n = strlen( original ); size_t m = strlen( toFind ); long long int success = -1; if ( !( n < m ) ) { n = n - m + 1; for ( size_t i = 0; success == -1 && i < n; i++ ) { size_t j = 0; while ( j < m && original[i+j] == toFind[j] ) j++; if ( j == m ) success = i; } } return success; } int main(void) { printf( "%lld\n", findSubString( "The dog was fast", "dog" ) ); return 0; }
它的输出是
4
你的循环是相反的。 外循环应该从零到originalLength
长度(包括两个)的位置; 嵌套循环应该将位置从零移动到toFindLength
(包括端点)。
originalLength
和toFindLength
都应该设置为strlen
返回的值,而不是strlen
加1,因为null终止符位置不是一个好的开始。
最后,您从外部循环内部返回-1
。 这太早了 – 只有在完成外循环后才应该返回-1
。
您的循环计数器测试不正确:错误的上限和限制关闭一个。 请注意,实际上没有必要进行测试,因为在点击'\0'
终止符时退出两个循环。
这是一个更简单的版本:
int findSubString(const char *original, const char *toFind) { for (size_t i = 0;; i++) { for (size_t j = 0;; j++) { if (toFind[j] == '\0') { return i; } if (original[i + j] != toFind[j]) { break; } } if (original[i] == '\0') { return -1; } } }
计算字符串长度以减少病理情况下的比较次数有一个小优点,例如findSubString("aaaaaaaaaaa", "aaaaaaaaaaaa");
int findSubString(const char *original, const char *toFind) { size_t originalLength = strlen(original); size_t toFindLength = strlen(toFind); if (toFindLength <= originalLength) { for (size_t i = 0; i <= originalLength - toFindLength; i++) { for (size_t j = 0;; j++) { if (toFind[j] == '\0') { return i; } if (original[i + j] != toFind[j]) { break; } } } } return -1; }