[英]Program producing a bus error when reading in using scanf - C Program
[英]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.