HDU2024 C语言合法标识符文本处理

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2024 C语言合法标识符文本处理相关的知识,希望对你有一定的参考价值。

C语言合法标识符
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 142616 Accepted Submission(s): 53684

Problem Description
输入一个字符串,判断其是否是C的合法标识符。

Input
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。

Output
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。

Sample Input
3
12ajf
fi8x_a
ff ai_2

Sample Output
no
yes
no

Author
lcy

Source
C语言程序设计练习(四)

问题链接HDU2024 C语言合法标识符
问题简述:(略)
问题分析
  按Markdown格式重写了题解,旧版题解参见参考链接。
  C语言的标识符是字母或下划线(’’)开头的,字母、下划线(’’)和数字的字符串。
  这个题的正解是用函数fgets()来实现,虽然用gets()函数来实现对付考试被比赛没有问题,工程中还是需要正解。
  解法一:用函数gets()实现
  如果用函数scanf()读入字符串,空行(直接输入回车)是个小陷阱,字符串中含有空格也是陷阱,是不可行的。可以用函数gets()实现,AC没有问题。
  解法二:用函数fgets()实现
  函数gets()存在风险,是新的C语言标准不推荐使用的,虽然用用也可以。正确的做法是使用函数fgets()来实现。
  如果已经有了用函数gets()的解题程序,只需要把所有的函数gets()调用换成函数fgets()调用并且代入合适的参数。还需要注意读入行结束符是’\\n’,而不是字符串结束符’\\0’。
  需要注意,函数gets()的第二个参数传递的是数组长度,需要考虑最后的空格或换行符号,所以N需要是定义为50+1。
程序说明
  C语言程序中要尽可能使用库函数。
参考链接HDU2024 C语言合法标识符【入门】
题记:(略)

WA的C语言程序(解法二:用函数fgets()实现,正解)如下:

/* HDU2024 C语言合法标识符 */

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

#define N 50 + 1
char s[N ];

int main(void)
{
    int n, ans = 0, i;
    fgets(s, N, stdin);
    n = atoi(s);
    while (n--) {
        fgets(s, N, stdin);
        if (!isalpha(s[0]) && s[0] != '_')
            ans = 0; /* 非字母或下划线开头则不是标识符 */
        else {
            ans = 1;
            for (i = 1; s[i] != '\\n' && ans; i++) {
                /* 字母、下划线或数字,则检查下一个字符 */
                if (isalpha(s[i]) || s[i] == '_' || isdigit(s[i]))
                    ;
                else
                    ans = 0; /* 非字母、下划线或数字则不是标识符 */
            }
        }

        puts(ans ? "yes" : "no");
    }

    return 0;
}

AC的C语言程序(解法一:用函数gets()实现)如下:

/* HDU2024 C语言合法标识符 */

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

#define N 50
char s[N + 1];

int main(void)
{
    int n, ans = 0, i;
    gets(s);
    n = atoi(s);
    while (n--) {
        gets(s);
        if(!isalpha(s[0]) && s[0] != '_')
            ans = 0; /* 非字母或下划线开头则不是标识符 */
        else {
            ans = 1;
            for (i = 1; s[i] && ans; i++) {
                /* 字母、下划线或数字,则检查下一个字符 */
                if (isalpha(s[i]) || s[i] == '_' || isdigit(s[i]))
                    ;
                else
                    ans = 0; /* 非字母、下划线或数字则不是标识符 */
            }
        }

        puts(ans ? "yes" : "no");
    }

    return 0;
}

以上是关于HDU2024 C语言合法标识符文本处理的主要内容,如果未能解决你的问题,请参考以下文章

HDU2024JAVA

关于c语言判断电话号码合法问题

关于c语言判断电话号码合法问题

c语言 检查输入是不是合法

2024

C语言符号常量定义