繁体   English   中英

使用scanf()将标识符读入C程序

[英]Reading an Identifier into a C Program using scanf()

我需要我的C程序能够使用C中的scanf()方法读取标识符。

在这种情况下,标识符是字母或_字符,后跟一个或多个字母数字字符,包括_字符。

正则表达式为

    [a-ZA-Z_][a-zA-Z0-9_]*

这些是正确标识符的示例:

    _identifier1
    variable21

这些是不正确标识符的示例

    12var
    %foobar

有谁知道如何在C语言中使用scanf()完成此操作?

scanf()不支持正则表达式。 标准C库完全不支持正则表达式。 您必须读取一个字符串,然后“手动”解析它。

例如:

#include <stdio.h>
#include <ctype.h>

int isIdentifier(const char* s)
{
  const char* p = s;

  if (!(*p == '_' || isalpha(*p)))
  {
    return 0;
  }

  for (p++; *p != '\0'; p++)
  {
    if (!(*p == '_' || isalnum(*p)))
    {
      return 0;
    }
  }

  return 1;
}

int main(void)
{
  const char* const testData[] =
  {
    "a",
    "a_",
    "_a",
    "3",
    "3a",
    "3_",
    "_3"
  };
  int i;

  for (i = 0; i < sizeof(testData) / sizeof(testData[0]); i++)
  {
    printf("\"%s\" is %san identifier\n",
           testData[i],
           isIdentifier(testData[i]) ? "" : "not ");
  }

  return 0;
}

输出:

"a" is an identifier
"a_" is an identifier
"_a" is an identifier
"3" is not an identifier
"3a" is not an identifier
"3_" is not an identifier
"_3" is an identifier

scanf的格式说明符是有限的。 它们不能用于识别您的标识符的模式。 我相信您只能对读取的字符串执行自定义验证,例如:

int in_range(char ch, char begin, char end)
{
    return ch >= begin && ch <= end;
}

int valid_start_char(char ch)
{
    return in_range(ch, 'a', 'z') ||
        in_range(ch, 'A', 'Z') ||
        ('_' == ch);
}

int valid_char(char ch)
{
    return valid_start_char(ch) || in_range(ch, '0', '9');
}

// ..

char buff[255];
int i, len = 0, valid = 0;
scanf("%s", buff);

len = strlen(buff);

if(len > 0)
    valid = valid_start_char(buff[0]);

for(i = 1 ; i < len ; ++i)
    valid = valid && valid_char(buff[i]);

if(valid)
    printf("Valid Identifier\n");
else
    printf("Invalid Identifier\n");

(我还没有测试过,但是应该可以说明这个想法)

如果您对使用正则表达式感到满意,为什么不只使用正则表达式库呢? 如果您使用的是POSIX兼容操作系统,则应该有一个正则表达式库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM