为什么我输入第一个标识符后按回车没反应啊?(这是个判断标识符的问题)


#include<stdio.h>
int main()
{
    int n=0,i=0,m=0,flag=0;
    char str[100],c;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%[^\t]",str); 
            if(str[0]>='A'&&str[0]<='Z'||str[0]>='a'&&str[0]<='z'||str[0]=='_')
            {
            for(m=0;(c=str[m]!='\0');m++)
                {
                    if((c=str[m])>='A'&&(c=str[m])<='Z'||(c=str[m])>='a'&&(c=str[m])<='z'||(c=str[m])=='_'||(c=str[m])>='0'&&(c=str[m])<='9')
                    flag=0;
                    else
                    {
                     flag=1;
                     break;
                    }
                }    
            if(flag==0)
            printf("Great\n");
            else
            printf("Bad\n");
            }
            else
            printf("Bad\n");
        }
    }
    return 0;
}

scanf("%[^\t]",str);改为scanf("%[^\n]",str);
while循环内加一个getchar()接收掉输入n的换行符

#include<stdio.h>
int main()
{
    int n=0,i=0,m=0,flag=0;
    char str[100],c;
    while(scanf("%d",&n)!=EOF)
    {
        getchar();
        for(i=1;i<=n;i++)
        {

            scanf("%[^\n]",str);
            if(str[0]>='A'&&str[0]<='Z'||str[0]>='a'&&str[0]<='z'||str[0]=='_')
            {
            for(m=0;(c=str[m]!='\0');m++)
                {
                    if((c=str[m])>='A'&&(c=str[m])<='Z'||(c=str[m])>='a'&&(c=str[m])<='z'||(c=str[m])=='_'||(c=str[m])>='0'&&(c=str[m])<='9')
                    flag=0;
                    else
                    {
                     flag=1;
                     break;
                    }
                }    
            if(flag==0)
            printf("Great\n");
            else
            printf("Bad\n");
            }
            else
            printf("Bad\n");
        }
    }
    return 0;
}

scanf("%[^\t]",str);
???这是什么鬼?C语言正则表达式?