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):为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应. 不同 ...
随机推荐
- 【Python数据分析】四级成绩分布 -matplotlib,xlrd 应用
最近获得了一些四级成绩数据,大概500多个,于是突发奇想是否能够看看这些成绩数据是否满足所谓的正态分布呢?说干就干,于是有了这篇文章.文章顺带介绍了xlrd模块的一些用法和matplotlib画自定义 ...
- 发一份shiro标准配置,特此记录
主要还是整合了本地ehcache,集群session管理过段时间放出 <?xml version="1.0" encoding="UTF-8"?> ...
- 第6章 Java类中的方法
1.如何定义java的方法 什么是方法:方法使用来解决一类问题的代码集合,是一个功能模块在类中定义个方法的方法是: 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 1.访问修饰符,是限制该方 ...
- Java 线程同步
线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的 ...
- etl实现字段值相加
数据库USERS表: etl步骤: (2) (3) 其中java代码为: import test.Test; public boolean processRow(StepMetaIn ...
- flask+sqlite3+echarts3+ajax 异步更新数据
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- 创建一个新的Activity
1.创建一个类继承Activity类,并创建对应的布局文件,在onCreate方法中加载该布局. 2.在AndroidManifest.xml声明该组件 注:如果想配置一个activity在桌面上有该 ...
- php 如何解决“您访问的域名有误或网页不存在”
对一个域名访问,在家访问正常,到办公室就总是看到下面的页面. 清楚浏览器浏览数据是一个解决途径.这里通过Chrome浏览做示例.通过标记路径,进入清除界面. 也可以在浏览器地址中输入 chrome:/ ...
- py-faster-rcnn +cudnn V5
转载自http://blog.csdn.net/u010733679/article/details/52221404,经过实际操作,采用了第二种手动替换代码文件.修改个别函数名的方式,成功编译. - ...
- MySQL二进制安装
前提 version mysql-5.5 platform centos6.x 添加用户 useradd -M -s /sbin/nologin mysql 安装需要的包 yum -y install ...