【发布时间】:2022-01-04 02:01:22
【问题描述】:
只是想知道是否有可能找到一个数字序列是否出现在一个元素、一个数组中。
例如;我在数组中有 long long int 元素,其中包括 = 22041991、22041990、22051991
我想找到并打印所有包含序列“1991”的元素。
我有找到完整元素的代码,即如果我输入“22041991”。但我希望能够挑选出所有包含“1991”的元素,而不必完全定位每个元素。
感谢所有帮助。谢谢。
【问题讨论】:
只是想知道是否有可能找到一个数字序列是否出现在一个元素、一个数组中。
例如;我在数组中有 long long int 元素,其中包括 = 22041991、22041990、22051991
我想找到并打印所有包含序列“1991”的元素。
我有找到完整元素的代码,即如果我输入“22041991”。但我希望能够挑选出所有包含“1991”的元素,而不必完全定位每个元素。
感谢所有帮助。谢谢。
【问题讨论】:
您可以使用标准库函数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".
但是,您似乎正在尝试比较年份,该年份始终存储在字符串的从零开始的字符索引 4 到 7 中。在这种情况下,只使用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".
【讨论】:
一种解决方案是将整数打印为字符串,然后使用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
【讨论】: