如何测试变量是否在一组值内?

时间:2011-12-19 16:27:05

标签: c

我正在运行一个循环来测试一个打字字符是否是一个字母。我希望像sql中的“IN”函数或者提供类似功能的方式 - 除了(变量=='A'||'a'||'B'||'b'||'C'| |'c'...)当然。我的意思是使用伪代码的一个例子是:

char c;
while ((c = getchar()) != EOF)
{
      if (c == 'upper or lower case letter')
      {
          runthis();
      }

      else
      {
           dothis();
      }
}

感谢。

7 个答案:

答案 0 :(得分:2)

如何调用isalpha()函数?

char c;
while ((c = getchar()) != EOF)
{
      if (isalpha((unsigned)c))
      {
          runthis();
      }

      else
      {
           dothis();
      }
}

确保您已添加<ctype.h>标题!此标头包含其他类似的功能,如islower()isupper(),它们分别告诉您字符是小写字母还是大写字母,isdigit()告诉您是否字符是一个数字。

答案 1 :(得分:1)

使用isalpha标头文件中的ctype.h功能。请参阅此处的documentation

用法:

#include <ctype.h>

...

if (isalpha(c))
{
    runthis();
}
else
{
    dothat();
}

答案 2 :(得分:1)

您可以使用isalpha()

#include <ctype.h>

int main(void)
{
    printf("%d\n", isalpha('x'));
    printf("%d\n", isalpha('5'));
}

此系列中有多种功能,例如isupper()islower()isalnum()isdigit()isspace()

答案 3 :(得分:0)

C有一个名为isalpha的函数来处理你的情况。

答案 4 :(得分:0)

解决标题中的问题(但对于范围连续的情况不太理想)。


整数类型(charshortintenum,...)的更一般答案是使用switch / {{ 1}}并利用堕落行为:

case

当然,您可以将案例包装在函数中以创建自己的switch (foo) { case SOME_VALUE: case ANOTHER_VALUE: case COMMON_VALUE: case NOT_SO_COMMON_VALUE: dowhatever(foo); break; default: dotheotherthing(foo); break; } 函数(与标准库函数iscategory()isspace()等)并行。只需isalpha()获取正确的值,而不是呼唤......

答案 5 :(得分:0)

有一整组字符分类函数。他们的名字很容易说明:

int isalnum(int c) // Equivalent to isalpha(c) || isdigit(c)
int isalpha(int c) // Letters
int isblank(int c) // Space or tab
int iscntrl(int c) // Control character
int isdigit(int c) // Digit
int isgraph(int c) // Printable character that's not space
int islower(int c) // Lowercase letter
int isprint(int c) // Printable characters including space
int ispunct(int c) // Printable characters except space and alphanumeric
int isspace(int c) // Checks for whitespace characters according to the locale
int isupper(int c) // Uppercase letters
int isxdigit(int c) // Hexadecimal digits

您可以在C11 standard 7.4.1

中进行了解

如果以上都不满足您的需要,则可以使用strchr()创建自己的文件。示例:

// Check if c is a lowercase vowel
char lcvowel[] = "aeiouy";
if(strchr(lcvowel, c)) {

如果您经常使用此类功能,请创建包装器:

int islowervowel(int c) {
    return schr("aeiouy", c);
}

Posix具有上面未列出的一项功能

int isascii(int c) // 7-bit ascii character set

我猜它不包含在标准C中的原因是C不假定ascii编码。也许他们只是觉得它没有足够的用处。不过,您可以在这里阅读有关此内容(以及所有其他内容)的信息:https://linux.die.net/man/3/isascii

答案 6 :(得分:-1)

我可以想到两个快速的方法。

首先,如果所有字符都在一个范围内,则可以与范围的边界进行比较。

if (c >= 'a' && c <= 'z')

另一种方法是使用一个查找表,该表为每个字符预先填充布尔值,以声明它是否具有所需的属性。

请注意,这个答案适用于一般情况 - 许多特定情况都有现有的库函数,例如确定字母字符。