题目;编写程序删除s数组中不符合C语言标识符命名规则的字符串,并输出剩余的字符串。
代码;
#include<stdio.h>
#include<string.h>
#define NUM 100
int main(void)
{
char s[NUM],temp[NUM];//定义两个字符数组
int i=0,flag=0,k;
gets(s);
for(;;){
//大循环 ,i=0时可能是刚刚开始对字符串判断或者判断到的字符串均为不满足要求的字符串;i不等于0时则说明判断中已经出现了满足要求的字符串
if(i==0){
flag=1;//i=0时flag初始值置为1
if(!(isalpha(s[0])!=0||s[0]=='_'))
//第一个字符既不是字母也不是下划线则将flag置为0
flag=0;
for(i=0;;i++){
//从第一个字符开始循环,当有空格或者到字符串的结尾时跳出循环进行下一步判断,否则一直进行循环,因为没有循环判断条件
if(s[i]==' ')
break;
if(s[i]=='\0')
break;
if(!(isalnum(s[i])!=0||s[i]=='_'))
//若该字符既不是字母也不是数字也不是下划线则将flag置为0
flag=0;
}
if(s[i]=='\0'&&flag==1)
break;
//当到字符串的结束符跳出且flag仍然为1时说明该数组中有且只有一个符合要求的字符串 ,则直接跳出整个for循环输出s数组
if(s[i]=='\0'&&flag==0){
//到字符串的结束符跳出且flag为0时说明该数组中有且只有一个不符合要求的字符串,则将第一个字符置为\0以使得puts无法输出
s[0]='\0';
break;
}
if(flag==0){
//当是在空格跳出且flag为0时说明出现一个不符合要求的字符串 ,s数组中不止一个字符串
strcpy(temp,s+i+1);
//把不符合要求的该字符串后面的字符串copy到temp字符数组中
s[0]='\0';
//将第一个字符置为 \0使得下面cat时temp中的字符直接覆盖第一个\0达到删除第一个字符串的目的
strcat(s,temp);//把temp中的字符串连接到s数组后面
i=0;
//将i置为0使得下一轮循环开始时继续从第一个字符开始判断
}
}
else{
//与最开始的if对应,即在上一轮if循环中跳出的那个字符串是满足要求的,i没有被置为0,则下一轮for循环执行的是下面的语句
flag=1;//重新将flag置为1
i++;
//当遇到空格跳出来且flag为1时说明是一个满足要求的字符串,i加1继续进行下一个字符串的判断
if(!(isalpha(s[i])!=0||s[i]=='_'))
//同if循环中一样,先判断一个字符串的开头是否满足条件,如果下一个字符串开头不是字母或下划线则flag置为0
flag=0;
k=i;
//用k来标记好此时的i位置 ,以便下面实现对字符串的strcopy与strcat
for(;;i++){
//从满足要求的字符串的下一个字符开始判断,判断过程同上,直到判断到第二个字符串结束跳出
if(s[i]==' ')
break;
if(s[i]=='\0')
break;
if(!(isalnum(s[i])!=0||s[i]=='_'))
flag=0;
}
if(s[i]=='\0'&&flag==1)
//说明有是一个满足要求的字符串且s中没有其他字符串了,则直接跳出并且输出
break;
if(s[i]=='\0'&&flag==0){
//说明该字符串不符合要求且后面没有字符串了则把该字符串的前一个位置置为\0使得输出在此处终止,该字符串不输出
s[k-1]='\0';
break;
}
if(flag==0){//若该字符串不满足要求
strcpy(temp,s+i+1);//把该字符串后面的字符串保留到temp中
s[k]='\0';
//把该字符串的第一位字符标记为\0使得覆盖之后字符串之间的空格仍然保留可以继续进行判断
strcat(s,temp);//temp中的字符串把该字符串覆盖掉,达到删除的目的
i=k-1;
//把i重新置为k-1即空格的位置对新的s数组中的字符串重新进行判断,进入下一轮for循环时i不等于0继续进入该else循环进行判断删除
}
}
}
puts(s);
return 0;
}
/*
样例输入
a%1 a12 aaa $ss 1sss
样例输出
a12 aaa
*/

浙公网安备 33010602011771号