首页 > 解决方案 > 是否有用于将字符串与字符表进行比较的 C 函数?

问题描述

IBM 的 REXX 语言有一个名为VERIFY的函数,它执行我正在寻找的功能:

给定两个字符串:stringreference

返回一个数字,默认情况下,指示string是否仅由reference中的字符组成;如果string中的所有字符都在引用中,则返回 0 ,或者返回string中第一个字符的位置,而 不是引用中。

例如,我想搜索一个字符串以确保它只包含元音:

str = "foo bar"        /* search string                     */
ref = "aeiou"          /* reference string                  */
loc = VERIFY(str, ref) /* "1" (in REXX, indexes start at 1) */

是否有一个 C 函数可以做到这一点?到目前为止,我所能找到的只是在循环中对每个字符(很多 OR)进行手动测试。

标签: cstringrexx

解决方案


是的,该strspn()功能会做你想做的事。细节与 REXX 的 VERIFY 略有不同,但您可以使用它来执行相同的测试。

具体来说,strspn()计算由指定集合中的字符组成的测试字符串的初始段的长度。这将为您提供不在集合中的第一个字符的(从零开始的)索引,或者如果整个字符串由指定集合中的字符组成,则为字符串的长度(这是其终止符的索引)。注意0返回值的意义必然不同。对于strspn(),它表示索引0处的字符不在集合中(或者,作为一种特殊情况,输入字符串为空)。

通过查看返回索引处的字符值,您可以轻松判断整个字符串是否由测试集中的字符组成:

char *str = "foo bar";          /* search string                     */
size_t loc;

loc = strspn(str, "aeiou");       // returns 0
printf("%d\n", (str[loc] == 0));  // prints  0

loc = strspn(str, "abfor");       // returns 3
printf("%d\n", (str[loc] == 0));  // prints  0

loc = strspn(str, " abfor");      // returns 7
printf("%d\n", (str[loc] == 0));  // prints  1

推荐阅读