问题描述:
在字符串处理的编程任务中,经常会遇到判断一个字符串数组中的元素是否为另一个字符串前缀的情况。例如,给定一个字符串数组 words
和一个字符串 s
,且 words[i]
和 s
都只包含小写英文字母,我们需要找出 words
中有多少个字符串是 s
的前缀。这一问题在文本分析、搜索引擎优化以及数据预处理等领域都有实际应用场景。
代码实现剖析:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 函数用于统计words数组中是字符串s前缀的字符串数目
int countPrefixes(char** words, int wordsSize, char* s) {int count = 0;// 遍历字符串数组wordsfor (int i = 0; i < wordsSize; i++) {char* word = words[i];int j = 0;// 逐个比较字符,直到不匹配或到达字符串末尾while (word[j]!= '\0' && s[j]!= '\0' && word[j] == s[j]) {j++;}// 如果word遍历完,说明是前缀if (word[j] == '\0') {count++;}}return count;
}int main() {// 定义示例的字符串数组wordschar* words[] = {"a", "ab", "abc", "abcd"};int wordsSize = sizeof(words) / sizeof(words[0]);// 定义目标字符串schar s[] = "abcde";// 调用函数进行统计int result = countPrefixes(words, wordsSize, s);printf("在给定的字符串数组中,是目标字符串前缀的字符串数目为: %d\n", result);return 0;
}
countPrefixes
函数部分:
-
首先定义了一个变量
count
并初始化为0
,用于记录满足是前缀条件的字符串个数。 -
接着通过
for
循环遍历传入的字符串数组words
,对于每个字符串(用words[i]
获取当前字符串指针,赋值给word
):-
初始化一个索引变量
j
为0
,进入while
循环开始逐个比较当前字符串word
和目标字符串s
的字符。只要word
和s
当前字符都不为'\0'
(表示字符串未结束)且对应字符相等,就继续向后比较下一个字符(通过j
自增实现)。 -
当
while
循环结束后,如果发现当前字符串word
已经到达末尾(即word[j] == '\0'
),那就说明word
是s
的前缀,此时将count
的值加1
。
-
-
最后函数返回
count
的值,也就是统计出的是前缀的字符串个数。
main
函数部分:
-
定义了一个示例的字符串数组
words
,里面包含了几个测试用的字符串,同时定义了目标字符串s
。 -
通过
sizeof
操作符计算出字符串数组words
的元素个数(即wordsSize
)。 -
调用
countPrefixes
函数并传入words
数组、wordsSize
以及目标字符串s
,将返回的结果存储在result
变量中。 -
最后使用
printf
函数输出统计结果,告知用户在给定的字符串数组中,是目标字符串前缀的字符串具体数目是多少。
总结与拓展
通过这个简单而实用的函数,我们展示了 C 语言在字符串处理方面的能力。这种前缀统计的功能在很多实际应用中都非常有用,比如在搜索引擎的关键词匹配、文本数据的预处理等场景。当然,我们还可以进一步拓展这个功能,例如统计每个前缀的出现次数并存储在一个数据结构中,或者对字符串数组进行预处理以提高查找效率等。希望读者能够深入理解这个代码示例,并尝试在自己的项目中灵活运用类似的字符串处理技巧。