在较大的字符串中查找子字符串的位置 [英] Finding the position of a substring in a larger string
问题描述
我创建了一个函数,该函数应该在较大的字符串中查找子字符串的第一个字符的数字位置.我的输出有一些问题,我不太确定为什么.这些问题包括每次都返回 -1 而不是子字符串的整数位置.我已经调试过,无法追踪函数出错的地方.
I have created a function that should find the numerical position of the first character of a substring in a larger string. I am having some problems with the output and I am not too sure why. These problems include -1 being returned every single time instead of the integer position of the substring. I have debugged and cannot trace where the function goes wrong.
这是函数应该如何执行:如果我的字符串是The dog was fast"并且我正在搜索子字符串dog",则该函数应该返回 4.感谢 chqrlie 对循环的帮助.
This is how the function should perform: If my string is "The dog was fast" and I am searching for the substring "dog", the function should return 4. Thanks to chqrlie for help with the loop.
这是函数:
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] == ' ') {
return i;
}
if (original[i + j] != toFind[j]) {
break;
}
}
if (original[i] == ' ') {
return -1;
}
}
}
函数参数不能修改,这是一个要求.任何帮助表示赞赏!
The function parameters cannot be modified, this is a requirement. Any help appreciated!
推荐答案
循环内的这些语句
if (toFind[j] == ' ') {
return i;
}
导致未定义的行为,因为字符串 toFind
可能比字符串 original
短.
results in undefined behavior because the string toFind
can be shorter than the string original
.
同样适用于这个循环
if (original[i + j] != toFind[j]) {
break;
}
因为i + j
可以大于字符串original
的长度.
because i + j
can be greater than the length of the string original
.
如果您要在其中查找子字符串,则无需扫描字符串 original
的所有字符.
And there is no need to scan all characters of the string original
if you are going to find a substring inside it.
还要检查字符串original
的长度是否不小于字符串toFind
的长度.
Also you should check whether the length of the string original
is not less than the length of the string toFind
.
如果你只想在字符串original
中找到字符串toFind
的第一个字符,使用标准C函数strchr
就足够了.如果你想在字符串 original
中找到整个字符串 toFind
那么你可以使用另一个 C 标准函数 strstr
.
If you want to find only the first character of the string toFind
in the string original
it is enough to use standard C function strchr
. If you want to find the whole string toFind
in the string original
then you could use another C standard function strstr
.
如果你想自己写一个函数来在其他字符串中查找一个字符串,那么它可以像下面这样查找
If you want to write the function yourself to find a string in other string then it can look for example the following way
我声明了这个函数
long long int findSubString( const char original[], const char toFind[] );
但是您可以根据需要编写其声明,例如
however you can write its declaration as you like for example like
int findSubString( char original[], char toFind[] );
但是在这种情况下,您应该像
But in this case you should declare function local variable success
like
int success = -1;
并使用格式说明符"%d"
而不是"%lld"
输出结果.
and output the result using format specifier "%d"
instead of "%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
", findSubString( "The dog was fast", "dog" ) );
return 0;
}
它的输出是
4
这篇关于在较大的字符串中查找子字符串的位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!