#循环输入。每组输入为一个长度不超过80的字符串,判断它是否是 C语言合法标识符。没有任何输入时,程序结束。C语言合法标识符需要满足如下条件:
1)出现空格(或tab)非法;
2)首字符不能是数字;
3)中间不能出现空格;
4)字符集合只有 数字、_、大写字母、小写字母;
解题思路1,设计一个函数,满足上面就返回1,否则返回0
2,第一个出现空格或者tap,一个if判断可以解决。
3,数字判断用if判断在0和1之间。
4,空格用if判断。
代码详解:
#includeconst int __UNDEFINE= 100000; char str[100]; //第一步判断是否是数字 int isNum(char c){ return c>='0'&&c<='9'; } //第二步判断是否是空格或者是tap int is_space_or_tap(char c){ return c==' '||c=='t'; } //字符集合中只有数字_大写字母小写字母 int judge_char(char c){ if(isNum(c))return 1;//数字判断 if(c>='A'&&c<='Z')retrun 1; if(c>='a'&&c<='z')return 1; if(c=='_')return 1; retrun 0; } int judge(const char* str) //函数的某个参量如果声明为const, 就表示在该函数内部不能对该参数进行修改。 这个参数如果是非地址变量,就没有必要加const ,因为这样的变量本身就是不可改变的, 只有参数是地址(数组名和指针)时, 加const才有意义,这里表示传入的是str指针,指针不可变,str可变。 { int i;//计数器 int s,t; s=__UNDEFINE; t=0; for(i=0;str[i];i++){ if(!is_space_or_tap(str[i])){ if(s==__UNDEFINE){ s=i;//对字符串进行遍历,得到最后一个不为空格和tap的下标,传给s } t=i;//全部遍历完成后,将长度给t }else{ retrun 0;//存在空格或者tap就直接返回0 } } if(s>t){ retrun 0;//空字符串最后一个是真值0,所以s会比t大 } if(isNum(str[s])){ retrun 0;//第一个不为空格的字符为数字,返回0 } for (i = s; i <= t; ++i) { if (is_space_or_tab(str[i])){ return 0; } if (!judge_char(str[i])){ return 0; } } return 1; } int main() { int t; scanf("%d", &t); getchar(); //scanf针对%c的输入而言:%c遇到空格、回车、跳格等结束符都是会读取的。所以用getchar获得回车 while (t--) { gets(str); printf("%sn", judge(str) ? "yes" : "no"); } return 0; }



