《C和指针》章节后编程练习解答参考——第9章
9.1
#include <stdio.h>
#include <ctype.h>
#include <string.h> #define N 100 int main (void)
{
int i = ;
char strarray[N+]; //= "Hello world! \t3I'm here!";
char *input = strarray;
char ch;
unsigned int cont = ;
int ctr=, spc=, num=, low=, upp=, puc=, upr=;
float ctrf=, spcf=, numf=, lowf=, uppf=, pucf=, uprf=; printf("Please enter a string:\n"); while (( ch = getchar() ) != '\n')
{
*(input + i) = ch;
i++;
}
*(input + i) = '\0';
cont = strlen(input); while (*input != '\0')
{
if (iscntrl(*input))
ctr++;
if (isspace(*input))
spc++;
if (isdigit(*input))
num++;
if (islower(*input))
low++;
if (isupper(*input))
upp++;
if (ispunct(*input))
puc++;
if (!(isprint(*input)))
upr++;
input++;
} printf("\nTotle char number is: Count = %d\n", cont);
printf("cntrl = %d,\tspace = %d,\tdigit = %d\n", ctr, spc, num);
printf("lower = %d,\tupper = %d,\tpunct = %d\n", low, upp, puc);
printf("uprint = %d\n", upr); ctrf = (float)ctr/(float)cont;
spcf = (float)spc/(float)cont;
numf = (float)num/(float)cont;
lowf = (float)low/(float)cont;
uppf = (float)upp/(float)cont;
pucf = (float)puc/(float)cont;
uprf = (float)upr/(float)cont; printf("\nHere is the percent of every count:\n");
printf("cntrl = %.3f%%\nspace = %.3f%%\ndigit = %.3f%%\n",ctrf* , spcf*, numf*);
printf("lower = %.3f%%\nupper = %.3f%%\npunct = %.3f%%\n", lowf*, uppf*, pucf*);
printf("uprnt = %.3f%%\n", uprf*); getchar();
return ;
}
9.3
#include <stdio.h>
#include <string.h> void my_strcpy(char *dst, char *src)
{
size_t len = , dstlen = , srclen = ;
dstlen = strlen(dst);
srclen = strlen(src); len = ( dstlen >= srclen ? srclen : dstlen );
strncpy(dst, src, len);
} void show_string(char *str)
{
while (*str != '\0')
printf("%c", *str++);
putchar('\n');
} int main (void)
{
char dst[] = "Hello";
char src[] = "I'm here!";
char *dstp = dst;
char *srcp = src; my_strcpy(dstp, srcp); show_string(dstp);
show_string(srcp); getchar();
return ;
}
9.4
#include <stdio.h>
#include <string.h> #define M 12
#define N 16 void my_strcat(char *dst, char *src)
{
size_t len = , dstlen = , srclen = , restlen = ;
dstlen = strlen(dst);
srclen = strlen(src); len = ( (restlen = M - dstlen - ) > srclen ? srclen : restlen );
strncat(dst, src, len);
} void show_string(char *str)
{
while (*str != '\0')
printf("%c", *str++);
putchar('\n');
} int main (void)
{
char dst[M] = "Hello!";
char src[N] = "I'm here!";
char *dstp = dst;
char *srcp = src; my_strcat(dst, src); show_string(dstp);
show_string(srcp); getchar();
return ;
}
9.5
#include <stdio.h>
#include <string.h> #define M 12
#define N 16 void my_strncat(char *dest, char *src, int dest_len)
{
size_t len = , dstlen = , srclen = , restlen = ;
dstlen = strlen(dest);
srclen = strlen(src); len = ( (restlen = dest_len - dstlen - ) > srclen ? srclen : restlen );
strncat(dest, src, len);
} void show_string(char *str)
{
while (*str != '\0')
printf("%c", *str++);
putchar('\n');
} int main (void)
{
char dst[M] = "Hello!";
char src[N] = "I'm here!";
char *dstp = dst;
char *srcp = src; my_strncat(dst, src, M); show_string(dstp);
show_string(srcp); getchar();
return ;
}
9.6
#include <stdio.h>
#include <string.h> char *my_strcpy_end(char *dst, char *src)
{
int i, dstlen = , srclen = ; dstlen = strlen(dst);
srclen = strlen(src); if ( dstlen >= srclen )
strcpy(dst, src);
else
strncpy(dst, src, dstlen); for ( i = ; *(dst + i) != '\0'; i++);
return dst + i;
} int main (void)
{
char *p = NULL;
char dst[] = "Hello world";
//char src[] = "123456789";
char src[] = ""; p = my_strcpy_end(dst, src); printf("%c\n", *(p - )); getchar();
return ;
}
9.8
#include <stdio.h>
#include <string.h> char *my_strnchr( char const *str, int ch, int which )
{
int i;
char *p = NULL;
p = str; for ( i = ; i < which; i++)
{
if ( i != )
p++;
p = strchr(p, ch);
} return p;
} int main (void)
{
int i;
char str[] = "Hello world!";
int chr = 'l';
int which = ; char *find = my_strnchr(str, chr, which); for (i = -; i < ; i++)
printf("%c\t", *(find + i));
putchar('\n'); getchar();
return ;
}
9.9
#include <stdio.h>
#include <string.h> int count_chars(char const *str, char const *chars)
{
int count = , len = ;
char *pos = NULL;
pos = str; while (( pos = strpbrk(pos, chars) ) != NULL )
{
count++;
pos++;
} return count;
} int main (void)
{
char str[] = "Hello world!";
char chars[] = "ero"; printf("%d\n", count_chars(str, chars)); getchar();
return ;
}
9.10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> int palindrome( char *string )
{
int i, j = ;
int len = strlen(string);
char *strcopy = NULL;
strcopy = malloc((len + )* sizeof(char));
for (i = ; i < len; i++) //将源字符串中的非字母字符去掉,并将剩下的字母转换为小写
{
if (isalpha(*(string + i)))
{
*(strcopy + j) = tolower( *(string + i) );
j++;
}
}
*(strcopy + j) = '\0'; len = strlen(strcopy);
for (i = ; i < (len / ); i++)
{
if ( (*(strcopy + i)) != (*(strcopy + (len - i - ) ) ) )
return ;
} return ;
} int main (void)
{
char string[] = "Madam, I'm Adam!";
int result = ; result = palindrome(string);
printf("%d\n", result); getchar();
return ;
}
9.11
#include <stdio.h>
#include <string.h> int main (void)
{
char input[];
char chars[] = "the";
int i = , count = ;
char *pos = NULL; printf("Please enter some words: \n");
scanf("%s", input);
printf("%s\n", input); pos = input;
while ((pos = strstr(pos, chars)) != NULL)
{
pos++;
count++;
} printf("There are %d \"%s\"!", count, chars); getchar();
getchar();
return ;
}
9.12 9.13 9.14
#include <stdio.h>
#include <string.h>
#include <ctype.h> char *init_alp(char *temp)
{
int i;
char alp = 'A'; for (i = ; i < ; i++)
{ *(temp + i) = alp;
alp++;
}
*(temp + i) = '\0'; return temp;
} int prepare_key( char *key ) //生成key
{
int i = , j = , k = ;
char alp[];
char *temp = alp; char *p = NULL; if (key == NULL) //key为空,退出
return ; for (i = ; *(key + i) != '\0'; i++)
if (!(isalpha(*(key + i)))) //key中含有非字母字符,退出)
return ; for (i = ; *(key + i) != '\0'; i++)
{
if (*(key + i) != ' ') //删除所有的空格
{
for (j = i + ; *(key + j) != '\0'; j++) //将重复的字母赋值为空格
{
if ( *(key + i) == *(key + j) )
*(key + j) = ' ';
}
*(key + k) = toupper(*(key + i));
k++;
}
}
*(key + k) = '\0'; temp = init_alp(temp); //初始化为大写字母表
p = temp;
while ((p = (strpbrk(p, key))) != NULL) //将字母表中含有key中的字母设置为空格
{
*p = ' ';
p++;
} for (i = , k = ; *(temp + i) != '\0'; i++) //删除所有的空格
{
if (*(temp + i) != ' ')
{
*(temp + k) = *(temp + i);
k++;
}
}
*(temp + k) = '\0'; key = strcat(key, temp); return ;
} void encrypt( char *data, char const *key ) //给数据加密
{
int i, state;
char temp[];
char *init = NULL;
char *p = NULL;
char chg; init = init_alp(temp); for (i = ; *(data + i) != '\0'; i++)
{
if (isalpha(*(data + i)))
{
if (isupper(*(data + i)))
state = ;
else
{
*(data + i) = toupper(*(data + i));
state = ;
}
p = strchr(init, *(data + i));
chg = *(key + (p - init));
*(data + i) = state ? chg : tolower(chg);
}
}
} void decrypt( char *data, char const *key ) //给数据解密
{
int i, state;
char temp[];
char *init = NULL;
char *p = NULL;
char chg; init = init_alp(temp); for (i = ; *(data + i) != '\0'; i++)
{
if (isalpha(*(data + i)))
{
if (isupper(*(data + i)))
state = ;
else
{
*(data + i) = toupper(*(data + i));
state = ;
}
p = strchr(key, *(data + i));
chg = *(init + (p - key));
*(data + i) = state ? chg : tolower(chg);
}
}
} int main (void)
{
char key[] = "Hellomnnnnab";
char temp[];
char *key_m = temp;
char data[] = "Hello world!"; key_m = init_alp(key_m);
printf("%s\n", key); //显示输入的key if (prepare_key(key))
{
printf("\nAlpha: \n"); //显示大写字母表
printf("%s\n", key_m);
printf("\nKey: \n"); //显示生成的key秘钥
printf("%s\n", key); printf("\nEncode: \n");
printf("%s\n", data);
encrypt(data, key); //加密
printf("%s\n", data); printf("\nDecode: \n");
printf("%s\n", data);
decrypt(data, key); //解密
printf("%s\n", data);
}
else
printf("Key error!\n"); getchar();
return ;
}
9.15
#include <stdio.h>
#include <string.h>
#include <ctype.h> void dollars(char *dest, char const *src)
{
int i, j, srclen = , offset = , state = ;
int a = , b = ;
char *destbak = NULL;
destbak = dest; srclen = strlen(src);
*dest++ = '$'; if (srclen >= )
{
a = (srclen - ) / ;
b = (srclen - ) % ; for (i = ; (i < a); i++)
{
if ( i == )
{
for (j = ; j < b; j++)
{
*(dest++) = *(src++);
}
} if (b != )
*(dest++) = ','; for (j = ; j < ; j++)
*(dest++) = *(src++);
} if ((a == ) && (b != ))
{
for (j = ; j < b; j++)
{
*(dest++) = *(src++);
}
}
*((dest++)) = '.'; for ( ; *(src) != '\0';dest++, src++)
*(dest) = *(src);
*(dest) = '\0';
}
else
{
memset(dest, '', );
*(++dest) = '.';
dest++;
for (i = ; i < - srclen; i++)
*(dest++) = ''; for (i = ; i < srclen; i++)
*(dest + i) = *(src + i);
}
} int dollchk(char *src) //检查要处理的数据中是否有非数字字符
{
int i;
for (i = ; *(src + i) != '\0'; i++)
{
if (!isdigit(*(src + i)))
{
return ;
}
}
return ;
} int main (void)
{
char temp[] = { }; //目标缓存
char dollar[];
char *dest = temp;
int state = ; printf("Please enter some numbers: \n");
scanf("%s", dollar); state = dollchk(dollar);
if (!state) //检查要处理的数据中含有非数字字符,报错,退出
{
printf("Data error!\n");
getchar();
getchar();
return ;
} printf("%s\n", dest);
printf("%s\n", dollar); dollars(dest, dollar);
if (*dest != '\0')
printf("%s\n", dest); getchar();
getchar();
return ;
}
9.16
#include <stdio.h>
#include <string.h> int format( char *format_string, char const *digit_string )
{
int formatlen = strlen(format_string);
int digitlen = strlen(digit_string);
int i, j, k;
char *p = NULL; if (formatlen < digitlen)
return ;
if ((*digit_string) == '\0')
return ; if ((p = strchr(format_string, '.')) != NULL)
{
if ((k = formatlen - (p - format_string)) > digitlen)
{
for (i = formatlen, j = digitlen; j >= ; i--, j--, k--)
{
*(format_string + i) = *(digit_string + j);
} for (; k > ; i--, k--)
{
*(format_string + i) = '';
} if ( (*(format_string + i) == '.') )
{
i--;
*(format_string + i) = '';
} for (i--; i >= ; i--)
{
*(format_string + i) = ' ';
}
}
else
{
for (i = formatlen, j = digitlen; j >= ; i--, j--)
{
if ( (*(format_string + i) == ',')
|| (*(format_string + i) == '.') )
i--;
*(format_string + i) = *(digit_string + j);
}
for (; i >= ; i--)
*(format_string + i) = ' ';
}
} return ;
} int main (void)
{
char formats[] = "###,###.#####";
char const digits[] = ""; printf("%s\n", formats);
printf("%s\n", digits);
if (format(formats, digits))
printf("%s\n", formats);
else
printf("Data error!\n"); getchar();
return ;
}
9.17
《C和指针》章节后编程练习解答参考——第9章的更多相关文章
- 《C和指针》章节后编程练习解答参考——第5章
5.1 题目: 略 解答代码: #include <stdio.h> int main(void) { char ch; while (((ch = getchar()) != EOF) ...
- 《C和指针》章节后编程练习解答参考——第10章
10.1 #include <stdio.h> typedef struct { unsigned ]; unsigned ]; unsigned ]; }TelphoneNumber; ...
- 《C和指针》章节后编程练习解答参考——第8章
8.1 #include <stdio.h> int main (void) { int a, b, c, d; // 不使用嵌套花括号初始化 unsigned ][][][] = { , ...
- 《C和指针》章节后编程练习解答参考——6.2
<C和指针>——6.2 题目: 编写一个函数,删除源字符串中含有的子字符串部分. 函数原型: int del_substr(char *str, char const *substr); ...
- 《C和指针》章节后编程练习解答参考——6.3
<C和指针>——6.3 题目: 编写一个函数,把参数字符串中的字符反向排列. 函数原型: void reverse_string(char *string); 要求: 使用指针而不是数组下 ...
- 《C和指针》章节后编程练习解答参考——6.6
<C和指针>——6.6 题目: 在指定的下限.上限之间使用数组方法查找质数,并将质数提取出来. 要求: 略 解答代码: #include <stdio.h> #define U ...
- 《C和指针》章节后编程练习解答参考——6.4
<C和指针>——6.4 题目: 质数是只能被1和本身整除的整数. 在1到1000之间的质数,在数组中剔除不是质数的数. 解答代码: #include <stdio.h> #de ...
- 《C和指针》章节后编程练习解答参考——6.1
<C和指针>——6.1 6.1 题目: 编写一个函数,在一个字符串中进行搜索,查找另一子字符串中出现的字符. 函数原型如下: char *find_char(char const *sou ...
- DSAPI多功能组件编程应用-参考-Win32API常数
DSAPI多功能组件编程应用-参考-Win32API常数 在编程过程中,常常需要使用Win32API来实现一些特定功能,而Win32API又往往需要使用一些API常数,百度搜索常数值,查手册,也就成了 ...
随机推荐
- Linq-表达式常用写法
这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下:1.select语句:books.Select( ...
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
1.Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...
- 移动Web开发图片自适应两种常见情况解决方案
本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...
- SpringMVC——项目启动时从数据库查询数据
SpringMVC项目中遇到这样的问题: 1.很多数据字典需要从数据库中查询: 2.懒得修改SQL语句: 3.想在项目中声明静态变量存储数据字典,但是希望这个字典可以在项目启动时进行加载. 当遇到这样 ...
- Java基础知识强化之IO流笔记51:IO流练习之 键盘录入学生信息按照总分排序写入文本文件中的案例
1. 键盘录入学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分排序写入文本文件中 分析: A:创建学生类 B:创建集合对象 TreeSet<Student> ...
- Android Activiy的作用
在Android应用程序中 ,Activity主要的负责创建窗口的,一个Activicy就是代表一个单独的屏幕,并且是用户唯一可以看到的东西 也就是说Activity就是用来实现和用户交互的,就和.n ...
- 监控Linux内存使用情况
cat mem.sh#!/bin/bashIP=`ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk -F ' ' '{print $2}'| aw ...
- 解决PL/SQL Developer中文乱码的问题
set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK cd "c:\Program Files\PLSQL Developer" PLSQL ...
- overflow:hiddden与绝对定位的应用场景的事例
做一个点击查看显示详细信息的效果. 说一下问题描述,最外面的父元素overflow-parent设置了overflow:hidden, 然后子元素overflow-child没有设置overflow, ...
- word ppt excel文档转换成pdf
1.把word文档转换成pdf (1).添加引用 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 /// <summary> /// ...