合法标识符这样写为什么不对

img


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

int main() {
char str[256];
int n, m = 0, p = 0, flag;
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++) {
gets(str);
flag = 0;
if ((*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z') || *str == '_')
flag = 1;
else
m++;
if (flag == 1) {
for (i = 1; i < strlen(str); i++) {
flag = 0;
if ((*(str + i) >= 'A' && *(str + i) <= 'Z') || (*(str + 1) >= 'a' && *(str + 1) <= 'z') || *(str + i) == '_'
|| (*(str + i) >= '0' && *(str + i) <= '9'))
flag = 1;
else {
m++;
break;
}
}
}
if (flag == 1)
p++;
}
printf("%d %d", m, p);
return 0;
}

#include<stdio.h>
#include<string.h>
int isValid(char*str)
{
int flag=1,x,i;
if(*str=='_'||str>='A'&&str<='Z'||*str>='a'||str<='z');
else flag=0;
x=strlen(str);
for(i=1;i<x;i++)
{
if(*(str+i)=='_'||*(str+i)>='A'&&
(str+i)<='Z'||*(str+i)>='a'||
(str+i)<='z'||*(str+i)>='0'&&
(str+i)<='9');
else flag=0;
}
return flag;
}
int main()
{
char str[256];
int n,i,sum=0;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(str);
sum+=isValid(str);
}
printf("Vaild:%d\n",sum);
printf("Invalid:%d",n-sum);
return 0;
}

scanf("%d\n",&x); 这里的\n删掉
if((*str=='_')||(*str>='a'&&*str<='z')||(*str>='A'&&*str<='Z')) str是字符串,应该用循环逐个字符进行比较啊,怎么是个if语句呢???

int i=0;
while(str[i] != '\0')
{
     if(str[i] == '_' || str[i] >='a' && str[i]<='z' || str[i]>='A' && str[i] <='Z')
     {
        //do nothing
     }
     else if(str[i] >= ' 0' && str[i] <='9')
     {
          if(i==0)
              break;
     }
     else
          break;
     i++;
}
if(str[i] == '\0')
    n++;
else
    m++;