【问题标题】:Find if sequence of values exist in element in array查找数组元素中是否存在值序列
【发布时间】:2022-01-04 02:01:22
【问题描述】:

只是想知道是否有可能找到一个数字序列是否出现在一个元素、一个数组中。

例如;我在数组中有 long long int 元素,其中包括 = 22041991、22041990、22051991

我想找到并打印所有包含序列“1991”的元素。

我有找到完整元素的代码,即如果我输入“22041991”。但我希望能够挑选出所有包含“1991”的元素,而不必完全定位每个元素。

感谢所有帮助。谢谢。

【问题讨论】:

    标签: arrays c search


    【解决方案1】:

    您可以使用标准库函数strstr来判断一个字符串是否包含某个子字符串。

    例子:

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        const char * const strings[] = { "22041991", "22041990", "22051991" };
        const char * const substr = "1991";
    
        int num_strings = sizeof strings / sizeof *strings;
    
        for ( int i = 0; i < num_strings; i++ )
        {
            printf( "The string \"%s\" ", strings[i] );
    
            if ( strstr( strings[i], substr ) != NULL )
                printf( "DOES " );
            else
                printf( "DOES NOT " );
    
            printf( "contain the substring \"%s\".\n", substr );
        }
    
        return 0;
    }
    

    这个程序有以下输出:

    The string "22041991" DOES contain the substring "1991".
    The string "22041990" DOES NOT contain the substring "1991".
    The string "22051991" DOES contain the substring "1991".
    

    但是,您似乎正在尝试比较年份,该年份始终存储在字符串的从零开始的字符索引 47 中。在这种情况下,只使用memcmp 比较这些字符会更合适,而不是搜索整个字符串。

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        const char * const strings[] = { "22041991", "22041990", "22051991" };
        const char * const target_year = "1991";
    
        int num_strings = sizeof strings / sizeof *strings;
    
        for ( int i = 0; i < num_strings; i++ )
        {
            printf( "The string \"%s\" ", strings[i] );
    
            if ( strlen(strings[i]) == 8 && memcmp( strings[i]+4, target_year, 4 ) == 0 )
                printf( "DOES " );
            else
                printf( "DOES NOT " );
    
            printf( "contain the year \"%s\".\n", target_year );
        }
    
        return 0;
    }
    

    这个程序有以下输出:

    The string "22041991" DOES contain the year "1991".
    The string "22041990" DOES NOT contain the year "1991".
    The string "22051991" DOES contain the year "1991".
    

    【讨论】:

    • 您好安德烈亚斯,非常感谢您的回答。那么,唯一的方法真的是转换为字符串吗?这很奇怪,因为我的问题要求我们从字符串转换为 long long int,执行某些操作等,所以然后转换回字符串似乎很奇怪。有没有办法通过 long long int 来实现这种搜索?谢谢。
    【解决方案2】:

    一种解决方案是将整数打印为字符串,然后使用strstr 搜索匹配项。

    但你也可以不使用字符串来做到这一点。

    您可以使用余数运算符%

    诀窍是对余数使用正确的 RHS 参数。

    如果您要查找 1 位数的值,请使用 10。

    如果您要查找 2 位数的值,请使用 100。

    如果您要查找 3 位数的值,请使用 1000。

    或者一般来说:10^number_of_digits

    计算出该参数后,您可以遍历要搜索的值。

    在伪代码中:

    m = 10^number_of_digits_in_value_to_search_for
    while value_to_search >= value_to_search_for
    {
        if ((value_to_search % m) == value_to_search_for) return FOUND
        value_to_search = value_to_search / 10
    }
    return NOT_FOUND
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2021-08-05
      • 1970-01-01
      • 2018-04-05
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多