|
这是俺重新写的一个答案。
圈哥,俺静静等着你
- /*practise 9.4*/
/* 一个函数的原型是: char *to_string(int count,double first,...); 这个函数返回一个字符串,这个字符串含有第二及其后参数的字符串表示,每个参数都有两位小数,参数间用逗号隔开。 第一个参数是从第二个参数算起的参数个数。编写一个main()函数,演示这个函数的运作。 */
/* 这个函数被我写的异常复杂,而且也没有分成子函数逐个完成。 比如说,itoa的转换; */
#include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h>
#define SINGLE_LENGTH 10
char *to_string(int count,double first,...); /*两位小数点浮点数转换成字符串子函数*/ void transfer_Double(double value,char *pbuffer);
int main(void) { char i ;
printf("You value list is:\n"); printf("%s\n",to_string(7,7.02,4.5999,1.436,12.43,3.67,12.67,4.020,0) ); return 0; }
char *to_string(int count,double first,...) { int j = 0; int i; char pSingle[SINGLE_LENGTH]; char *pReturn = NULL; va_list pvar; va_start(pvar,first);
pReturn = (char *)calloc(100,sizeof(char)); /*把所有浮点数转换成字符串*/ for(i = 0;i < count;i++) { if(i == 0) transfer_Double(first,pSingle); else transfer_Double(va_arg(pvar,double),pSingle); strcat(pReturn,pSingle); //逐一连接起来 if(i != count - 1) //非最后一个,加一个逗号 pReturn[strlen(pReturn)] = ','; } pReturn[strlen(pReturn)] = '\0'; //加一个结束符 return pReturn; }
void transfer_Double(double value,char *pbuffer) { char i,j; int I_value; char Swap[SINGLE_LENGTH]; for(i = 0;i < SINGLE_LENGTH;i++) Swap[i] = 0; I_value = (int)(100 * value + 0.00001); //小数点后两位,所以乘以100 ,加0.5弥补截断???? /*于是乎,这一句,就成了整个程序最难得地方,究竟该如何弥补截断?*/ i = 0; do { if(i == 2) Swap[i++] = '.'; else { Swap[i++] = I_value % 10 + '0'; I_value /= 10; } }while(I_value); Swap[i] = 0; /*逆转顺序*/ for(j = 0;j < i;j++) pbuffer[j] = Swap[strlen(Swap) - 1 - j]; pbuffer[j] = 0; }
复制代码
|
|