你可以简单地检查一个字符串是否存在于一个字符串数组中。更好的解决方案可能是实际返回该字符串:
char *
string_find(char **haystack, char *needle, size_t max)
{
char **end = haystack + max;
for (; haystack != end; ++haystack)
if (strcmp(*haystack, needle) == 0)
return *haystack;
return NULL;
}
如果您希望数组中的所有字符串都是唯一的,就可以将其视为一个集合来使用:
typedef struct set_strings {
char **s_arr;
size_t count;
size_t max;
} StringSet;
.
.
.
int
StringSet_add(StringSet *set, const char *str)
{
if (string_find(set->s_arr, str, set->count))
return 1;
return 1;
}
如果您想实际操作字符串,也可以使用这种方式:
void
reverse_str(char *str, size_t n)
{
char c;
char *end;
for (end = str + n; str < --end; ++str) {
c = *str;
*str = *end;
*end = c;
}
}
.
.
.
char *found = string_find(words, word, word_count);
if (found)
reverse_str(found, strlen(found));
作为一个通用算法,它是相当有用的,甚至可以根据需要应用于其他数据类型(当然需要一些重新调整)。正如
undefined behaviour's answer所指出的那样,它在大量字符串上不会很快,但对于简单和小型的东西来说已经足够好了。
如果您需要更快的东西,那个答案中给出的建议是很好的。如果您自己编写代码,并且能够保持事物排序,那么这是一个好主意。这使您能够使用比线性搜索更好的搜索算法。标准的
bsearch
很棒,但如果您想要适合快速插入的搜索例程,则可能需要一个搜索例程,该例程将为您提供插入新项的位置,以避免在
bsearch
返回
NULL
后搜索位置。换句话说,既然可以一次搜索并完成相同的事情,为什么要搜索两次呢?
all_strings
列表,逐个字符串执行strcmp
与您要比较的字符串(其他字符数组)进行比较。 - lurker