题目
对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列
- 字符范围:由a到z,A到Z,数字范围:由0到9
- 符号”的定义
(1)”做为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;
(2)连续出现2个’及以上时视为字符串间隔符,如“out–standing"中的“-“视为间隔符,是2个独立整体字符串"out"和"standing"; - 除了1,2里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后间隔符作为空格处理;
- 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只介许出现一个字格间隔符:
输入示例
I am an 20-years out–standing @ * -stu- dent
输出示例
dent stu standing out 20-years an am I
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int isValid(char * p){
if (*p>='a'&&*p<='z' || *p>='A'&&*p<='Z' || *p>='0'&&*p<='9'){
return 1;
}
else {
return 0;
}
}
int main(){
char str[250];// char * str 会有问题;从标准输入中读取字符串,要声明为字符数组,不能是一个指向字符的指针
char * p = str;
char myChar[100];
char myCharArray[100][20]={'\0'};
char (*pc)[20];
pc = myCharArray;
gets(str);// scanf("%s",str); scanf 遇到空格字符会停止;gets 可以读取一行,遇到换行符停止
// I am an 20-years out--standing @ * -stu- dent
// printf("%s\n",str);// 测试是否读取成功。
int len = strlen(str);
for (int i = 0;i<len;i++){
if (isValid(p)){
myChar[i] = *p;
}
else if (*p=='-' && isValid(p-1)&&isValid(p+1)){
myChar[i] = *p;
}
else{
myChar[i] = ' ';
}
p++;
}
myChar[len]='\0';
// printf("%s\n",myChar);
int i = 0;
int j = 0;//行的索引,有几个单词
int k = 0;//列的索引,每个单词有几个字符
while(myChar[i]!='\0'){
if(isValid(myChar+i) || myChar[i]=='-'){
*(*(pc+j)+k) = myChar[i];
k++;
}
else{
j++;
k = 0;
}
i++;
}
// for(int i=0;i<15;i++){
// printf("%s",*(pc+i));
// }
for (int i=j;i>=0;i--){
if (*(*(pc+i))!='\0'){
printf("%s ",*(pc+i));
}
}
printf("\n");
system("pause");
return 0;
}