字符串排序(3);多单词含逗号字符串处理;单个字符逐个处理;注意顺序;scanf;C语言
字符串排序(3)
https://ac.nowcoder.com/acm/contest/5646/J
#include <stdio.h>
#include <string.h>
// scanf:
// 除空格字符外的普通字符必须与输入严格匹配,除%c外其他转换说明都会自动跳过待输入值前面所有的空白
// 若格式说明字符之间有逗号,且在逗号前加空白,则逗号前后有无空格的输入均可识别ok
// 格式字符串中的空白意味着跳过下一个输入项前面的所有空白(C Primer Plus P95)
//(注scanf(" %c",&ch)是从第一个非空白字符开始读取;而scanf("%c",&ch)是从输入中的第一个字符开始读取)
int main()
{
int flag = 0;
int i,j,n;
while(1){
char s[100][1000];
char *p[100]; // 内含100个指针变量(指向字符类型)的数组
char *tmp;
int endflag=0;
for(i=0;;i++){
for(j=0;;j++){
if(scanf("%c",&s[i][j])==EOF){ // 注意此处若没有空格,则%s会输入整个字符串,所以需要按字符读取处理
flag = 1; // 读取输入完毕
break;
}
// printf("%c",s[i][j]);
if(s[i][j]==','){
break;
}
if(s[i][j]=='\n'){
endflag = 1;
break;
}
}
// 当已到达文件结尾即scanf返回值为EOF时,并不会有endflag为1,会导致死循环而数组越界等
if(flag){ // 注意此处也要判断用以退出循环,否则会发生段错误....!!
break;
}
// 注意每行的最后一个单词也要加结束符\0,并完成赋值操作
// !! 此上下3处顺序很重要,易出现段错误情况,注意仔细处理,定位了好久...
s[i][j]='\0'; // 替换逗号,给单词加上结束符
p[i] = s[i];
// printf("%s\n",p[i]);
if(endflag){ // 该行输入完毕
// printf("\n");
break;
}
}
if(flag){
break;
}
// 下面的排序与字符串排序(1)字符串排序(2)大致相同
n = i+1;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(strcmp(p[i],p[j])>0){
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
}
for(i=0; i<n-1; i++){
printf("%s,",p[i]);
}
printf("%s\n",p[i]);
}
return 0;
}

查看10道真题和解析