判断是否为C语言的合法标识符

C语言中的合法标识符的定义为:以下划线或字母开头的字母数字串(含下划线)。
完成一个程序实现对输入的n个字符串进行判定,是否为C语言的合法标识符。如果是则输出1,不是则输出0

以下为我的程序:

#include <stdio.h>
#include <string.h>

int main()
{
char str[1000][80];
int i,j,k,n,flag=1;
scanf("%d",&n);
for(j=0;j<n;j++)
{
for(k=0;k<80;k++)
scanf("%s",&str[j][k]);
}
for(j=0;j<n;j++)
{
k=0;
if(str[j][k]==95||str[j][k]>64&&str[j][k]<91||str[j][k]>96&&str[j][k]<123)
{
for(k=1;k<80;k++)
{
if(str[j][k]==95||str[j][k]>64&&str[j][k]<91||str[j][k]>96&&str[j][k]<123||str[j][k]>47&&str[j][k]<58)
continue;
else
{
printf("0\n");
break;
}
}
printf("1\n");
}
else
printf("0\n");
}
return 0;
}

我试图用ASCII码来判断 但是第三个循环那里有些小问题 请问如何改正?

这不是小问题啊……你这个问题很大啊……

#include <stdio.h>
#include <string.h>
int main()
{
    char str[1000][80];
    int i,j,k,n,flag=1,len;
    scanf("%d",&n);
    for(j=0;j<n;j++)
    {
        /*不要k循环。80代表字符串的最长长度,但是字符串也可能不到80个字符,所以不应该一个个字符的读入,而且%s代表读入一整个字符串而不是一个字符。所以应该读入到str[j]里。前面不用&号因为str[j]已经是地址了。*/
        scanf("%s",str[j]);
    }
    /*我帮你调了缩进,你看一下是不是清晰了很多……最内层的else如果print 0之后break,后面还会print 1。这是最大的问题*/
    /*我们用一个flag变量代表当前字符串是否合法。1代表合法,0不合法,最后统一输出即可。*/
    for(j=0;j<n;j++)
    {
        k=0;
        flag=1;
        if(str[j][k]==95||str[j][k]>64&&str[j][k]<91||str[j][k]>96&&str[j][k]<123)
        {
            /*我们不知道字符串有多长。所以k<80不行。*/
            len = strlen(str[j]);
            for(k=1;k<len;k++)
            {
                if(str[j][k]==95||str[j][k]>64&&str[j][k]<91||str[j][k]>96&&str[j][k]<123||str[j][k]>47&&str[j][k]<58)
                    continue;
                else
                {
                    flag=0;
                    break;
                }
            }
        }
        else
            flag=0;
        printf("%d\n",flag);
    }
    return 0;
}

最后再补充几点,

    不用统一输入统一输出。输入一个字符串,处理,输出,再输入下一个即可。

    || && 一起用的时候加括号,避免潜在的逻辑错误

    用'A'来取A字符的ascii码。你就不用去查表了。而且就算你要直接用ascii值,str[j][k]>=48也比str[j][k]>47可读性大很多。

    所以你这里完全可以写成

    str[j][k]>='A'&&str[j][k]<='Z'

温馨提示:答案为网友推荐,仅供参考
相似回答