我创建了一个函数,该函数应该在较大的字符串中找到子字符串的第一个字符的数字位置。我的输出出现问题,我不太清楚为什么。这些问题包括每一次返回-1而不是子字符串的整数位置。我已经调试,无法跟踪功能出了问题的地方。
函数应按以下方式执行:如果我的字符串为“狗快了”,而我正在搜索子字符串“dog”,则函数应返回4。感谢chqrlie提供的循环帮助。
这是函数:
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
中找到字符串original
的第一个字符,那么使用标准C函数strchr
就足够了。如果要在字符串toFind
中找到整个字符串original
,则可以使用另一个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 <stdio.h>
#include <string.h>
#include <stddef.h>
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