C Primer Plus 第六版编程练习第十一章答案和记录一些学习历程

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

首先:从输入中获取n个字符(且包括换行符):
两种情况下会停止输入:
第一到达限定获取范围;第二读取到文件的结尾。
所以要分别考虑这两种情况。
然后:函数需要返回一个指针参数,想到fgets()函数等,读到文件结尾返回空指针NULL。

/* Programming Exercise 11-1 */ 
#include <stdio.h> 
#define LEN 10 //定义从输入中获取10个字符 

char * getnchar(char * str, int n); //定义储存函数,返回参数为char类型指针 

int main(void) 
{
        
	char input[LEN];//存储字符串的数组     
	char *check;
	
	puts("please enter the string which characters size below 10:");          
	check = getnchar(input, LEN - 1);//返回存储数组的首字符地址     
	if (check == NULL) //如果返回的是空指针        
		puts("Input failed.");     
	else         
		puts(input);     
	puts("Done.\n");          
	
	return 0; 
} 
char * getnchar(char * str, int n) 
{
        
	int i;     
	char ch; 
    
	for (i = 0; i < n; i++)//读取9个字符,超过跳出。     
	{
            
		ch = getchar();         
		if (ch != EOF)            
			str[i] = ch;         
		else        //读取到文件结尾结束      
			break;     
	}     
	if (ch == EOF)     //如果读到文件结尾,则说明未读取10个字符    
		return NULL;   //返回空指针  
	else     
	{
            
		str[i] = '\0';  //添加字符串空字符(\0)       
		return str;     //返回指针名 
	} 
}

运行结果:
在这里插入图片描述

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

首先:这里有三种情况:
①在n个字符后停止。
②读到第一个空白,制表符或换行符停止。
③读到文件结尾,只有这个算是不正常输入。
所以:与题1相比,只需要添加停止输入的条件即可。

/* Programming Exercise 11-1 */ 
#include <stdio.h> 
#define LEN 10 //定义从输入中获取10个字符 

char * getnchar(char * str, int n); //定义储存函数,返回参数为char类型指针 

int main(void) 
{
        
	char input[LEN];//存储字符串的数组     
	char *check;
	
	puts("please enter the string which characters size below 10:");          
	check = getnchar(input, LEN - 1);//返回存储数组的首字符地址     
	if (check == NULL) //如果返回的是空指针        
		puts("Input failed.");     
	else         
		puts(input);     
	puts("Done.\n");          
	
	return 0; 
} 
char * getnchar(char * str, int n) 
{
        
	int i;     
	char ch; 
    
	for (i = 0; i < n; i++)//读取9个字符,超过跳出。     
	{
            
		ch = getchar();         
		if (ch != EOF && ch != ' ' && ch != '\n' && ch != '\t')            
			str[i] = ch;         
		else        //读取到文件结尾,空白,换行符,制表符结束      
			break;     
	}     
	if (ch == EOF)     //如果读到文件结尾,则说明未读取10个字符    
		return NULL;   //返回空指针  
	else     
	{
            
		str[i] = '\0';  //添加字符串空字符(\0)       
		return str;     //返回指针名 
	} 
}

运行结果:
在这里插入图片描述

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

对于没有空白,制表符或换行符的情况,我们可以调用ctype.h头文件中的isspace()函数判断是否为空白。
首先:我们通过限定条件当未读到文件结尾和输入字符不是空白开始输入第一个字符。这样跳过了了第一个非空白字符前面所有的空白。
然后:我们使用getchar()读取但不存储字符,从而舍弃单词之后的空白。直到输入换行符提示输入结束。

/* Programming Exercise 11-3 */ 
#include <stdio.h>
#include <ctype.h> //判断空白字符头文件 
#define LEN 80 

char * getword(char * str);//定义存储字符的函数 
 
int main(void) 
{
        
	char input[LEN];
	          
	while (getword(input) != NULL)         
		puts(input);     
	puts("Done.\n");
	          
	return 0; 
} 

char * getword(c
  • 13
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值