#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *my_fgets(char *p,int n);
void dollars_a(char *dest,char *src);
void dollars(char *dest,char *src);
void dollars1(char *dest,char *src);
int main(){
char input[101]={0};
char *output=(char *)calloc(1,sizeof(char));
for(fputs("Input the number of dollars:->",stdout);
my_fgets(input,101)&&*input;
fputs("Input the number of dollars:->",stdout)){
for(char *input_temp=input;*input_temp;input_temp++)
if(*input_temp<'0'||*input_temp>'9')
*input=0;
if(!*input) continue;
else dollars(output,input);
fputc('$',stdout);
fputs(output,stdout);
fputc(10,stdout);
}
if(output) free(output),output=NULL;
fputs("OVER\n",stdout);
return 0;}
//
char *my_fgets(char *p,int n){
char ch=0,*input=NULL,*found=NULL;
if(input=fgets(p,n,stdin))
if(found=strchr(input,10))
*found=0;
else
while((ch=getchar())!=EOF&&ch!=10);
return input;}
void dollars_a(char *dest,char *src){//官方答案
if(!dest||!src) return ;
size_t len_src=strlen(src);
char *ptemp=dest;
if(ptemp=(char *)realloc(ptemp,((len_src>2?(len_src+(len_src-2-1)/3+1):4)+1)*sizeof(char)))
dest=ptemp;
else
return;
if(len_src>=3){
for(int i=len_src-2;i>0;){
*dest++=*src++;
if(--i>0&&!(i%3))
*dest++=',';
}
}
else
*dest++='0';
*dest++='.';
*dest++=len_src>1?*src++:'0';
*dest++=*src++;
*dest=0;
}
void dollars(char *dest,char *src){//自己答案,有些繁琐,但时间差不多
if(!dest||!src) return ;
size_t len_src=strlen(src);
char *ptemp=dest;
if(ptemp=(char *)realloc(ptemp,((len_src>2?(len_src+(len_src-2-1)/3+1):4)+1)*sizeof(char)))
dest=ptemp;
else
return;
for(int i=len_src>2?len_src:3,flag=0;*src;){
if(!flag&&i==2) *dest++='.',flag=1;
else if(!flag&&len_src>5&&!((i-2)%3)) *dest++=',',flag=1;
else if(len_src<3&&i>(int)len_src) *dest++='0',i--,flag=0;
else *dest++=*src++,i--,flag=0;
}
*dest=0;
}
void dollars1(char *dest,char *src){//自己另一个答案:预测dest数组的长度存入变量len_dest,烦且慢
if(!dest||!src) return ;
size_t len_src=strlen(src);
size_t len_dest=(len_src>2?(len_src+(len_src-2-1)/3+1):4);
char *ptemp=dest;
if(ptemp=(char *)realloc(ptemp,(len_dest+1)*sizeof(char)))
dest=ptemp;
else
return;
for(size_t i=len_dest;i>0;i--,dest++){
if(i==3) *dest='.';
else if(len_src<3&&i>len_src) *dest='0';
else if(i>5&&!((i-3)%4)) *dest=',';
else *dest=*src++;
}
*dest=0;
}
|