标题:求一个判断字符串能否为变量名的程序
只看楼主
薇儿2333
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2018-4-19
结帖率:66.67%
已结贴  问题点数:20 回复次数:3 
求一个判断字符串能否为变量名的程序
求助大佬
Xiaoming is learning C Programming Language recent decades, but he can't identify whether a variable name valid for C, please implement a program to help him.
If the input string is valid, output "yes", otherwise, output "no". The system identifiers are invalid, because you should not use them.
The input contains more than one lines and each lines contains no more than 256 characters.
Note that the key identifiers of C are as follows:
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while
Sample Input
123
for
SQOOP_HOME
__name__
mail@
Sample Output
no
no
yes
yes
no
搜索更多相关主题的帖子: 判断 the for input output 
2018-04-19 23:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:10 
大意就是先判断第一个字符是否是字母或者下划线,然后判断中间是否是下划线字母或者是数字,最后看看该命名是否是关键字~

程序代码:
#include<stdio.h>
#include<assert.h>

int fun( const char* );

int main( void )
{
    assert(fun("123"));
    assert(fun("for"));
    assert(!fun("SQOOP_HOME"));
    assert(!fun("__name__"));
    assert(fun("mail@"));
    
    return 0;
}

#include<ctype.h>
#include<string.h>
#include<stdlib.h>

int fun( const char* s )
{    
    assert(s);

    for (;isspace(*s);++s);
    
    if (!*s)
        return -1;
    
    if (isdigit(*s))
        return -2;
    
    {
        size_t n;
        
        sscanf(s,"%*[_|0-9|a-z|A-Z]%n",&n);
        
        {
            size_t _n=n;
            
            for (;isspace(*(s+_n));++_n);
        
            if (*(s+_n))
                return -3;
        }
     
        {
            const char* key=
            {
                 "\
                 auto break case char const\
                 continue default do double else \
                 enum extern float for goto \
                 if int long register return \
                 short signed sizeof static struct \
                 switch typedef union unsigned void \
                 volatile while\
             "
           };
           
           const char* mark=NULL;
   
           if (isspace(*(s+n)))
           {
                char* buf=( char* )malloc(n*sizeof ( char ));
                                     
                assert(buf);
                
                strncpy(buf,s,n);                
                
                mark=strstr(key,buf);
                
                free(buf);
            }
            else  
                mark=strstr(key,s);
           
            if (mark)
                return -4;
        }
        
    }

    return 0;
}


PS:这个算法匹配关键字的效率笑笑就算了,正常来说编译器一般是用哈希表来快速寻找关键字的信息的~


[此贴子已经被作者于2018-4-20 13:07编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-20 11:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
回复 2楼 九转星河
根据C标准

允许作为标志符字符的有
    下划线、26个大写字母、26个小写字母、10个数字字符,以及如下范围的unicode字符
    00A8,  00AA,  00AD,  00AF, 00B2-00B5,  00B7-00BA,  00BC-00BE,  00C0-00D6,
    00D8-00F6, 00F8-00FF
    0100-167F, 1681-180D, 180F-1FFF
    200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
    2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
    3004-3007, 3021-302F, 3031-303F
    3040-D7FF
    F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
    10000-1FFFD,  20000-2FFFD,  30000-3FFFD,  40000-4FFFD,  50000-5FFFD,
    60000-6FFFD,  70000-7FFFD,  80000-8FFFD,  90000-9FFFD,  A0000-AFFFD,
    B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

允许作为标志符字符的有
    10个数字字符,以及如下范围的unicode字符
    0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F
2018-04-20 12:10
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 3楼 rjsp
好的,先做个标记,到时去了解一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-20 12:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486212-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.237028 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved