9.15 编写函数格式化金钱为标准字符串

#include <stdio.h>
#include <string.h>
#define TEMP_LEN 1000 void dollars(char *dest, char const * src)
{ int len;
int num;
//当长度大于二,第一个逗号之前的字数
int headerLen;
//当前复制的位置
int loc;
len = strlen(src);
char *dstTmp = dest; if (len <= 2) {
//长度小于二,所有的都是五位,且前三位为 "$0.", 从第五位'\0'开始向前复制
loc = 5;
strcpy(dest, "$0.");
//开始复制,还没有到复制结束点,即小数点前时
while (loc >= 3) {
//如果还有值需要复制,则继续复制
if (len >= 0) {
dest[loc] = src[len];
len--;
}else{
//如果没有值复制,则补零
dest[loc] = '0';
}
//向前位移一位
loc--;
}
}else{
/*长度大于二,最后两位可以先不管,将剩下的长度,与三 mod 操作,余数是开始的逗号前面的数字个数。
例如123456, (6 - 2) % 3 = 1,则第一个逗号前有1个数字,余数为零不加逗号*/
*(dstTmp++) = '$';
//当前正在复制的字符的坐标,和头部字符个数 0 1 2对应 3位 1位 2位
loc = 0;
headerLen = (len - 2) % 3;
//开始从头往后复制字符
while (loc < len - 2) {
//当前位置为headerLen余数 + 3时,且src长度大于5时,此位置放置逗号,第一位不放逗号
if (len > 5 && (loc % 3) == headerLen && loc > 0) {
*dstTmp++ = ',';
*dstTmp = src[loc++];
}else {
//其他情况均复制字符,loc移动一位
*dstTmp = src[loc];
loc++;
}
dstTmp++;
}
//尾数处理,加小数点,然后把最后两个数加上,然后加一个'\0'尾.
*dstTmp++ = '.';
*dstTmp++ = src[loc++];
*dstTmp++ = src[loc];
*dstTmp = '\0';
}
} int main()
{
char src1[] = "";
char src2[] = "1";
char src3[] = "12";
char src4[] = "123";
char src5[] = "1234";
char src6[] = "12345";
char src7[] = "123456";
char src8[] = "1234567";
char src9[] = "123456789";
char dest[100]; dollars(dest, src1);
printf("%s\n", dest); dollars(dest, src2);
printf("%s\n", dest); dollars(dest, src3);
printf("%s\n", dest); dollars(dest, src4);
printf("%s\n", dest); dollars(dest, src5);
printf("%s\n", dest); dollars(dest, src6);
printf("%s\n", dest); dollars(dest, src7);
printf("%s\n", dest); dollars(dest, src8);
printf("%s\n", dest); dollars(dest, src9);
printf("%s\n", dest); while (1)
;
return 0;
}

  运行:

9.16 指定格式格式化数字字符串

#include <string.h>
#include <stdio.h>
#define FALSE 0
#define TRUE 1 int format(char *format_string, char const *digit_string)
{
int format_len = strlen(format_string);
int digit_len = strlen(digit_string); //不符合要求数字字符串
if (digit_len > format_len || digit_len == 0) {
return FALSE;
}
//小数点位置指针,以及格式化字符和数字字符串末尾位置指针。
char *point_ptr = strchr(format_string, '.');
char *format_ptr = format_string + format_len;
char *digit_ptr = digit_string + digit_len; //是否需要补零,如果小数点位置相对于数字结束位置左边则需要补零
int need_zero = FALSE;
if (point_ptr != NULL && point_ptr < (format_string + format_len - digit_len )) {
need_zero = TRUE;
} //最后一位是'\0'
format_ptr--;
digit_ptr--;
while (format_ptr >= format_string) {
//如果还有数字需要复制
if (digit_ptr >= digit_string) {
//正常情况直接复制
if (*format_ptr == '#') {
*format_ptr = *digit_ptr;
digit_ptr--;
}else if(*format_ptr == '.' || *format_ptr == ','){
//遇到小数点,跳过小数点复制
format_ptr--;
*format_ptr = *digit_ptr;
digit_ptr--;
}
}else{
//数字字符复制完后,如果需要补零,则补零,否则补空
if (need_zero == TRUE && format_ptr >= point_ptr) {
//到达小数点位置,后面的就不需要补零
if (format_ptr == point_ptr) {
format_ptr--;
need_zero = FALSE;
}
*format_ptr = '0';
}else{
//多余位补 _
*format_ptr = '_';
}
}
format_ptr--;
}
} int main()
{
char format_str1[] = "###,###.###";
char digit1[] = "1";
format(format_str1, digit1);
printf("%s\n", format_str1); char format_str2[] = "###,###,###";
char digit2[] = "12345";
format(format_str2, digit2);
printf("%s\n", format_str2); char format_str3[] = "###,###.###";
char digit3[] = "123";
format(format_str3, digit3);
printf("%s\n", format_str3); char format_str4[] = "###,###.###";
char digit4[] = "1234";
format(format_str4, digit4);
printf("%s\n", format_str4); while (1)
;
return 0;
}

  执行结果:

C和指针 第九章 习题的更多相关文章

  1. C和指针 第九章 字符串 字符 字节

    C语言中没有字符串类型,字符串是以NUL结尾的字符数组组成的. 高级字符串查找: //计算字符串起始部分,有多少字符是在group中 size_t strspn(char const * str, c ...

  2. Learning Perl 第九章习题第二题

    把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法

  3. java编程思想第四版第九章习题

    第三题 package net.mindview.interfaces; abstract class Base{ public Base(){ print(); } abstract void pr ...

  4. PythonCrashCourse 第九章习题

    创建一个名为Restaurant 的类,其方法__init__() 设置两个属性: restaurant_name 和cuisine_type 创建一个名为describe _restaurant ( ...

  5. 第九章 C语言在嵌入式中的应用

    上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...

  6. [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】

    第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...

  7. perl5 第九章 关联数组/哈希表

    第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九 ...

  8. 第九章&#183;词典

    第九章·词典 散列:原理 散列是一种赖以高效组织数据并实现相关算法的重要思想. 这样的思想背后的原理却非常直观.简单. 上图是IBM公司和联想公司的服务电话号码,能够看到这样的号码是由数字和字母共同组 ...

  9. 【C++】《C++ Primer 》第九章

    第九章 顺序容器 一.顺序容器概述 顺序容器(sequential container):为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应. 不同 ...

随机推荐

  1. codevs2178 表达式运算Cuties[笛卡尔树]

    2178 表达式运算Cuties  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 给出一个表达 ...

  2. 第6章 Java类中的方法

    1.如何定义java的方法 什么是方法:方法使用来解决一类问题的代码集合,是一个功能模块在类中定义个方法的方法是: 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 1.访问修饰符,是限制该方 ...

  3. 用Access为支撑,书写一个用C#写入数据库的案列

    /// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...

  4. struts之类型转换

    Struts2的内置类型转换器: Struts2的内置类型转换器,可以为你处理大多数的类型转换,这包括了以下类型和String类型之间的转换! 1.String 将int,double,boolean ...

  5. PHP开发工具+电子书+视频教程等资料下载汇总

    本汇总帖包括如下内容: PHP开发工具.PHP IDE PHP学习资源 基础.进阶类 PHP学习资源 高级及应用类 经典PHP视频教程系列 1. PHP开发工具.PHP IDE: PHP开发工具:Ze ...

  6. iOS证书问题

    链接: 关于IOS免证书真机安装的过程和问题 苹果IOS开发者账号的区别,企业账号,个人账号,公司团队账号,教育账号 苹果IOS开发者账号总结--发布应用APP时team name是否可以随意写? P ...

  7. 配置文件类 Properties

    Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息. Properties属于集合类,继承于Hashtable. Properties要注意的细节:    1. 如果配置文 ...

  8. EXT总结例子

     //页面按钮点击展开隐藏 {  空格                    xtype:'fieldset',                    title:'<b>高级搜索< ...

  9. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

  10. 【抓包工具】wireshark

    wireshark下载地址:http://download.csdn.net/detail/victoria_vicky/8819777 一.wireshark优劣势 wireshark劣势:只能查看 ...