C Primer Plus 第6版 编程练习 chapter 11

1. 第1题

1.1 题目描述

设计并测试一个函数,从输入中获取下n个字符(包括空白、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数 。

1.2 编程源码

# include<stdio.h>

void get_char(char *c, int n){
	char t;
	int i=0;
	while((t = getchar())!= EOF && i<n){
		c[i] = t;
		++i;
	}
}

int main(void){		
	char c[5]; 
	get_char(c, 5);
	for(int i= 0;i<5;++i){
		putchar(c[i]);
	}
	
	return 0;
}

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

修改并编程练习1的函数,在n个字符后停止,或在读到第一个空白、制表符或换行符停止 ,哪个先遇到哪个停止。不能只使用scanf();

2.2 编程源码

# include<stdio.h>
# include<ctype.h>

void get_char(char *c, int n){
	char t;
	int i=0;
	while((t = getchar())!= EOF && i<n){
		if(isspace(t)) break;
		c[i] = t;
		++i;
	}
}

int main(void){		
	char c[5]; 
	get_char(c, 5);
	for(int i= 0;i<5;++i){
		putchar(c[i]);
	}
	
	return 0;
}

2.3 结果显示结果显示


3. 第3题

3.1 题目描述

设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数 应该跳过第一个非空字符前面的所有空白。将一个单词定义为没有 空白、制表符或换行符的租字符序列。

3.2 编程源码

# include<stdio.h>
# include<ctype.h>

void get_char(char *c){
	char t;
	int i=0;
	int flag = 0;
	while((t = getchar())!= EOF && t != '\n'){
		if(isspace(t) && !flag)continue;
		if(isspace(t) && flag)break;
		if(isalpha(t) && flag){
			c[i] = t;
			++i;
		}
		if(isalpha(t) && flag == 0){
			c[i] = t;
			++i;
			flag = 1;
		}
		
	}
	c[i+1] = '\0';
}

int main(void){		
	char c[40]; 
	get_char(c);
	printf("%s\n",c);	
	return 0;
}

3.3 结果显示

结果显示


4. 第4题

4.1 题目描述

设计并测试一个函数,它类似于编程3的描述,只不过它接受第2个参数指明可读取的最大字符数。

4.2 编程源码

# include<stdio.h>
# include<ctype.h>

void get_char(char *c, int n){
	char t;
	int i=0;
	int flag = 0;
	while((t = getchar())!= EOF && t != '\n' && i<n){
		if(isspace(t) && !flag)continue;
		if(isspace(t) && flag)break;
		if(isalpha(t) && flag){
			c[i] = t;
			++i;
		}
		if(isalpha(t) && flag == 0){
			c[i] = t;
			++i;
			flag = 1;
		}
		
	}	
	c[i+1] = '\0';
}

int main(void){		
	char c[40]; 
	get_char(c, 5);
	printf("%s\n",c);	
	return 0;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

设计并测试一个函数,搜索第1个 函数形参指定的字符串,在其中查找第2个函数形参指定的字符首次出现的位置。如果成功,则函数返回指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与strchr函数相同)。在一个完整的程序中测试该函数,使用一个循环函数提供输入值。

5.2 编程源码

# include<stdio.h>
# include<ctype.h>

char *get_char(char *str, char c){
	char *id = NULL;
	while(*str != EOF){
		if(*str == c){
			id = str;
			break;
		}
		++str;
	}	
	return id;
}

int main(void){		
	char str[] ="dog is runing on the grass\n";
	printf("原字符串为:%s\n",str);	
	
	char* c = get_char(str, 'o');
	if(c != NULL) printf("%c 在该字符串中\n", 'o');
	else  printf("%c 不在该字符串中\n", 'o');
	
	return 0;
}

5.3 结果显示

结果显示


6. 第6题

6.1 题目描述

编写一个名为is_within的函数,接受一个字符和一个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数,使用一个循环给函数输入值。

6.2 编程源码

# include<stdio.h>
# include<ctype.h>

int is_within(char *str, char c){
	int id = 0;
	int i=0;
	while(*str != '\0'){
		if(*str == c){
			id = i ;
			break;
		}
		++str;
		++i;		
	}	
	return id;
}

int main(void){		
	char str[] ="dog is runing on the grass\n";
	printf("原字符串为:%s\n",str);	
	
	char c;
	int n;
	while((c=getchar())!= EOF && isalpha(c)){
		n = is_within(str, c);
		printf("%d\n",n);
		if(n) printf("%c 在该字符串中\n", str[n]);
		else  printf("%c 不在该字符串中\n", c);
	}	
	
	return 0;
}

6.3 结果显示

结果显示


7. 第7题

7.1 题目描述

strncpy(s1,s2,n)把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

7.2 编程源码

# include<stdio.h>
# include<string.h>

void mystrncpy(char *s1, const char* s2, int n){
	if(n<=strlen(s2)){
		for(int i=0;i<n;++i)*s1++=*s2++;
	}else{
		while(*s2 != '\0') *s1++=*s2++;
		*s1='\0';
	}
}

int main(void){		
	char s1[] ="ab";
	char s2[] ="abcdef";	
	
	char s[5];
	printf("S1原字符串为:%s\n",s1);
	mystrncpy(s,s1,5);
	printf("S1拷贝字符串为:");
	for(int i=0;i<5;++i)putchar(s[i]);
	
	printf("\nS2原字符串为:%s\n",s2);
	mystrncpy(s,s2,5);
	printf("S2拷贝字符串为:");
	for(int i=0;i<5;++i)putchar(s[i]);	
	
	return 0;
}

7.3 结果显示

结果显示


8. 第8题

8.1 题目描述

编写一个名为string_in的函数,接受两个指向字符串的指针作为参数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。例如,string_in(“hats”,“at”)将返回hats中的a地址,否则该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。

8.2 编程源码

# include<stdio.h>
# include<string.h>

const char* string_in(char *s1,const char* s){
	int m = 0;
	char* c = NULL;
	while(*s != '\0'){
		if(*s != s1[m]){
			++s;
			m = 0;
			continue;
		}else{
			++s;
			++m;
			if(m == strlen(s1)-1){
				c = s-m;
				break;
			}
		}		
	}
	return c;
}

int main(int argc, char** argv){		
	char s[100];
	char s1[10];
	const char *c;
	puts("请输入你的字符串(空行退出程序):");
	while(gets(s)&& gets(s1) && s[1] != '\0' && s[0] != '\0'){
		c = string_in(s1, s);
		puts(c);
		puts("请输入你的字符串(空行退出程序):");
	}
	
	return 0;
}

8.3 结果显示

结果显示


9. 第9题

9.1 题目描述

编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整的程序中测试该函数,使用一个循环提供输入值值。

9.2 编程源码

# include<stdio.h>
# include<string.h>

void string_in(char *s){
	char t;
	for(int i=0,j = strlen(s)-1;i<j;++i,--j){
		t = s[i];
		s[i] = s[j];
		s[j]= t;
	}
}

int main(int argc, char** argv){		
	char s[100];
	puts("请输入你的字符串(空行退出程序):");
	while(gets(s) && s[0] != '\0'){
		string_in(s);
		puts(s);
		puts("请输入你的字符串(空行退出程序):");
	}
	
	return 0;
}

9.3 结果显示

结果显示


10. 第10题

10.1 题目描述

编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,知道用户输入一行空行。该程序应该应用该函数只每个输入字符串,并显示处理后的字符串。

10.2 编程源码

# include<stdio.h>
# include<string.h>
# include<ctype.h>

void string_in(char *s){
	int m = 0;
	for(int i=0;i<strlen(s);++i){
		if(isspace(s[i])){
			++m;
			continue;
		}
		s[i-m] = s[i];
	}
	s[strlen(s)-m] = '\0' ;
}

int main(int argc, char** argv){		
	char s[100];
	
	puts("请输入你的字符串(空行退出程序):");
	while(gets(s)&& s[0] != '\0'){
		string_in(s);
		puts(s);
		puts("请输入你的字符串(空行退出程序):");
	}
	
	return 0;
}

10.3 结果显示

文本内容:

abc 123 ref 345

结果显示


11. 第11题

11.1 题目描述

编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单中各选项的功能。

11.2 编程源码

# include<stdio.h>
# include<string.h>
# include<ctype.h>

void print_a(char *s[10],int n){
	for(int i=0;i<n;++i) puts(s[i]);
}

void print_b(char *s[10],int n){
	char *t;
	for(int i = 0;i<n;++i){
		for(int j=i+1;j<n;++j){
			if(strcmp(s[i],s[j])>0){			
				t = s[i];
				s[i] = s[j];
				s[j] = t;
				
			}
		}
	}
	print_a(s,n);
}

void print_c(char *s[10],int n){
	char *t;
	for(int i = 0;i<n;++i){
		for(int j=i+1;j<n;++j){
			if(strlen(s[i])> strlen(s[j])){			
				t = s[i];
				s[i] = s[j];
				s[j] = t;
				
			}
		}
	}
	print_a(s,n);
}

int wordlen(const char* s1, const char*s2){
	int m = 0;
	int n = 0;
	while(*s1 != '\0'){
		if(!isalpha(*s1++))break;
		++m;
	}
	while(*s2 != '\0'){
		if(!isalpha(*s2++))break;
		++n;
	}
	return m-n;
}

void print_d(char *s[10],int n){
	char *t;
	for(int i = 0;i<n;++i){
		for(int j=i+1;j<n;++j){
			if(wordlen(s[i],s[j])>0){			
				t = s[i];
				s[i] = s[j];
				s[j] = t;				
			}
		}
	}
	print_a(s,n);
}

void display_menu(void){
	puts("*******************************************************************");
	puts("a. 打印原字符串				b. 以ASCII中的顺序打印字符串");
	puts("c. 按长度递增顺序打印字符串	d. 按字符串中第一个单词的长度打印字符串");
	puts("q. 退出");
	puts("*******************************************************************");
}

int main(int argc, char** argv){		
	char s[10][100];
	char *ps[10];
	int i=0;
	
	puts("请输入你的字符串(数量<=10):");
	for(i=0;i<10;++i){
		if(gets(s[i]) && s[i][0] == '\0') break;
		ps[i] = s[i]; 
	}
	
	char c;
	display_menu();
	while((c=getchar())!= EOF){
		while(getchar() != '\n');
		switch(c){
			case 'a':puts("a. 打印原字符串");print_a(ps,i);break;
			case 'b':puts("b. 以ASCII中的顺序打印字符串");print_b(ps,i);break;
			case 'c':puts("b. 按长度递增顺序打印字符串");print_c(ps,i);break;
			case 'd':puts("b. 按字符串中第一个单词的长度打印字符串");print_d(ps,i);break;
			default:return 0;
		}	
	}
	
	return 0;
}

11.3 结果显示

显示结果


12. 第12题

12.1 题目描述

编写一个程序,读取输入,直至读到EOF,报告单词数、大写字母数、小写字母数、标点数和数字字符数。使用ctype.h头文件中的函数.

12.2 编程源码

# include<stdio.h>
# include<ctype.h>

int main(int argc, char** argv){		
	char c;
	int word_num = 0;
	int up_num = 0;
	int low_num = 0;
	int pan_num = 0;
	int dig_num = 0;
	int flag = 0;
	while((c=getchar())!=EOF){
		if(isupper(c))++up_num;
		if(islower(c))++low_num;
		if(ispunct(c))++pan_num;
		if(isdigit(c))++dig_num;
		if(isalpha(c)) flag = 1;
		if(flag && !isalpha(c)){
			flag = 0;
			++word_num;
		}
	}
	
	printf("单词数:%d\n", word_num);
	printf("大写字母数:%d\n", up_num);
	printf("小写字母数:%d\n", low_num);
	printf("标点数:%d\n", pan_num);
	printf("数字数:%d\n", dig_num);
	
	return 0;
}

12.3 结果显示

文档内容:

dog is running on the grass.
dog is eating.

结果显示


13. 第13题

13.1 题目描述

编写一个程序,反序显示命令行参数单词。例如 第一个 命令行参数是see you later,该程序应该打印 later you see。

13.2 编程源码

# include<stdio.h>
# include<string.h>

int main(int argc, char** argv){		
	for(int i=strlen(argv[1])-1;i>=0;--i)putchar(argv[1][i]);
	putchar('\n');
	return 0;
}

13.3 结果显示

结果显示


14. 第14题

14.1 题目描述

编写一个通过命令行运行的程序计算幂,第一个命令行参数是double类型的数,作为幂的底数,第二个参数是整数,作为幂的指数。

14.2 编程源码

# include<stdio.h>
# include<stdlib.h>
# include<math.h>

int main(int argc, char** argv){		
	printf("%s 的 %s 次幂为%.2lf\n", argv[1],argv[2],pow(atof(argv[1]),atof(argv[2])));
	return 0;
}

14.3 结果显示

结果显示


15. 第15题

15.1 题目描述

使用字符串分类函数实现atoi函数。如果输入的字符串不是纯数字,该函数返回0.

15.2 编程源码

# include<stdio.h>
# include<ctype.h>

int a2i(const char* s){
	int num = 0;
	int sum=0;
	int f = 1;
	while(*s != '\0'){
		sum *= 10;
		if(!isdigit(*s)){
			f = 0;
			break;
		} 
		sum = (sum+*s-'0');
		++s;
	}
	if(f) num = sum;
	return num;
}

int main(int argc, char** argv){		
	
	printf("%s 转换为 %d\n", "123", a2i("123"));
	printf("%s 转换为 %d\n", "12d3", a2i("12d3"));
	return 0;
}

15.3 结果显示

显示结果


16. 第16题

16.1 题目描述

编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。

16.2 编程源码

# include<stdio.h>
# include<ctype.h>

int main(int argc, char** argv){		
	int n = 1;
	char c;
	switch(argv[1][1]){
		case 'p': n =1;break;
		case 'u': n =2;break;
		case 'l': n =3;break;
	}
	while((c=getchar())!=EOF){
		if(n == 1) putchar(c);
		if(n == 2) putchar(toupper(c));
		if(n == 3) putchar(tolower(c));
	}
	printf("\n Done\n");
		
	return 0;
}

16.3 结果显示

文档内容:

dog is running on the grass.
dog is eating.

运行结果:
结果显示


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值