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

#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;
}

2处错误:

  1. break后面的分号改为半角分号
  2. str指针哪里有的加了解引用运算符*,有的没加,还有一处写成了&。

我帮你改正过来了,代码见下面。如果对你有帮助,望采纳。

#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 <cctype>
#include <cstdio>
#include <iostream>
#include <iterator>
#include <set>
#include <utility>
#include <vector>
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include <map>
#include "string.h"
#include <cstring>
#include<algorithm>
#include <stack>
#include <queue>

using namespace std;


int main() {
    char str[256];
    int n, m = 0, p = 0, flag;
    scanf("%d", &n);
    getchar();
    for (int i = 0; i < n; i++) {
        fgets(str,sizeof(str), stdin);
        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;
}