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. 俄罗斯方块(Win32实现,Codeblocks+GCC编译)

    缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...

  2. [tem]Longest Increasing Subsequence(LIS)

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...

  3. Linux下部署docker记录(1)-Volume使用

    之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文 ...

  4. VS 常用高效 快捷键

    强迫智能感知:Ctrl+J.智能感知是Visual Studio最大的亮点之一,选择Visual Studio恐怕不会没有这个原因. 2 撤销:Ctrl+Z.除非你是天才,那么这个快捷键也是最常用的. ...

  5. HTML中&nbsp; &ensp; &emsp; &thinsp;等6种空白空格的区别

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格 (       ‌‍)在不同浏览器中宽度各异.   ...

  6. # 2015-2016-2 《Java程序设计》课程总结

    2015-2016-2 <Java程序设计>课程总结

  7. Linux 下配置php开发环境

    windows下有一键安装的环境很方便,不过现实中常常服务器是linux系统.想要搭建环境怎么搞呢? 边学变发直播博客,不定期更新.

  8. linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题

    linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...

  9. ASP.NET MVC 必须设置 ErrorMessageString 或 ErrorMessageResourceName,但不能同时设置二者。

    解决方案: 1.此错误是指你的验证错误信息为空(required="")和required提示信息一致,引发的错误. 简单的来说就是两个验证错误提示消息一样了. 2.修改提示消息解 ...

  10. oracle误删表解决方案

    ·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理:利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块 ...