Problem: 排序
Description: 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Solution: 我们利用string.h中的strtok函数。这个函数可以按指定分隔符分隔字符串,我个人是看了这个函数的源码才理解为什么是下面这种用法。建议百度一下这个函数去看看,其实这个题目也可以不用这个函数完成的。也可以用strstr+strncpy完成。下面我都给出源码。
Code(C++):
strtok:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int M=1005;
int cmp(const void *a,const void *b)
{
return *((int *)a)-*((int *)b);
}
int main()
{
char string[M];
int digit[M];
int top;
while(~scanf("%s",string)){
top=0;
for(char *str=strtok(string,"5");str!=NULL;str=strtok(NULL,"5"))
digit[top++]=atoi(str);
qsort(digit,top,sizeof(digit[0]),cmp);
printf("%d",digit[0]);
for(int i=1;i<top;i++)
printf(" %d",digit[i]);
puts("");
}
return 0;
}
strstr+strncpy:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int M=1005;
int cmp(const void *a,const void *b)
{
return *((int *)a)-*((int *)b);
}
int main()
{
char string[M];
int digit[M];
int top;
while(~scanf("%s",string)){
top=0;
int len=strlen(string);
string[len]='5';
string[len+1]=0;
char *next=string;
for(char *p=strstr(next,"5");p!=NULL;p=strstr(next,"5")){
if(next==p){
next++;
continue;
}
char tmp[15]={0};
strncpy(tmp,next,p-next);
digit[top++]=atoi(tmp);
next=p+1;
}
qsort(digit,top,sizeof(digit[0]),cmp);
printf("%d",digit[0]);
for(int i=1;i<top;i++)
printf(" %d",digit[i]);
puts("");
}
return 0;
}