C和指针 第九章 习题
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和指针 第九章 习题的更多相关文章
- C和指针 第九章 字符串 字符 字节
C语言中没有字符串类型,字符串是以NUL结尾的字符数组组成的. 高级字符串查找: //计算字符串起始部分,有多少字符是在group中 size_t strspn(char const * str, c ...
- Learning Perl 第九章习题第二题
把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法
- java编程思想第四版第九章习题
第三题 package net.mindview.interfaces; abstract class Base{ public Base(){ print(); } abstract void pr ...
- PythonCrashCourse 第九章习题
创建一个名为Restaurant 的类,其方法__init__() 设置两个属性: restaurant_name 和cuisine_type 创建一个名为describe _restaurant ( ...
- 第九章 C语言在嵌入式中的应用
上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...
- [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】
第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...
- perl5 第九章 关联数组/哈希表
第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九 ...
- 第九章·词典
第九章·词典 散列:原理 散列是一种赖以高效组织数据并实现相关算法的重要思想. 这样的思想背后的原理却非常直观.简单. 上图是IBM公司和联想公司的服务电话号码,能够看到这样的号码是由数字和字母共同组 ...
- 【C++】《C++ Primer 》第九章
第九章 顺序容器 一.顺序容器概述 顺序容器(sequential container):为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应. 不同 ...
随机推荐
- HTML ------ 关于表单 Form
Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...
- springboot Serving Web Content with Spring MVC
Serving Web Content with Spring MVC This guide walks you through the process of creating a "hel ...
- Oracle SQL函数
Oracle将函数大致分为单行函数,聚合函数和分析函数. 单行函数分为字符函数,日期函数,转换函数,数字函数,通用函数,decode函数 一.字符函数 1)大小写控制函数 01.Lower() 全部小 ...
- java之多线程 一
概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程与线程: 进程是指处于运 ...
- Java — JTree and JTable以及sqlServer的两种连接
使用JTree的步骤: 暂时只能创建一个头结点,创建一个树的结点作为头结点(其子结点也是相同的创建方法):DefaultMutableTreeNode headNode = new DefaultMu ...
- LeetCode:3Sum, 3Sum Closest, 4Sum
3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closest t ...
- Swift学习(二):自定义扩展方法(Extensions)
扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality) 扩展可以 添加计算型属性和计算静态属性 定义实例方法和类型方法 提供新的构造器 定义下标 定义和使用新的嵌套类型 使一 ...
- 通过sqlserver发送邮件
配置过程请参考:http://www.2cto.com/database/201403/289114.html 实际中应用的扩展: 1.编写一个触发器(相当于一个多线程的发邮件的服务). 2.在应用程 ...
- WCF学习笔记一
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...
- .bat文件和Jar包的生成及运行
.bat文件和Jar包的生成及运行 1.Jar包简单介绍 Jar包是Java中所特有的一种压缩文档,有点类似于zip包,区别在于Jar包中有一个META-INF\MANIFEST.MF文件(在生成Ja ...