在较大的字符串中查找子字符串的位置 [英] Finding the position of a substring in a larger string

查看:28
本文介绍了在较大的字符串中查找子字符串的位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个函数,该函数应该在较大的字符串中查找子字符串的第一个字符的数字位置.我的输出有一些问题,我不太确定为什么.这些问题包括每次都返回 -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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆