C和指针(POINTERS ON C) 第一章课后习题答案

**

1.7

**

  1. C是一种自由形式的语言,也就是说并没有规则规定它的外观究竟应该怎样。但本章的例子程序遵循了一定的空白使用规则。你对此有何看法?

答:空行将程序的不同部分分隔开来;制表符(tab)用于缩进语句,更好地显示程序的结构等等。C是一种自由格式的语言,并没有规则要求你必须怎样书写语句。然而,如果你在编写程序时能够遵守一些约定还是非常值得的,它可以使代码更加容易阅读和修改。

  1. 把声明(如函数原型的声明)放在头文件中,并在需要时用#include指令把他们包含于源文件中,这种做法有什么好处?

答:#include指令叫做预处理指令,它们是由预处理器解释的,预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。例如:预处理器用名叫stdio.h的库函数头文件的内容替换#include<stdio.h>指令,其结果就相当于把stdio.h复制道文件中。好处:如果你有一些声明需要用于几个不同的源文件,你在一个单独的文件中编写这些声明,然后用#include指令把这个文件包含道需要使用这些声明的源文件中。这样,你就只需要这些声明的一份拷贝,用不着再许多不同的地方进行复制,避免了再维护这些代码时出现错误的可能性。

  1. 使用#define指令给字面值常量取名有什么好处?

答:#define也是预处理指令的一种,例子:#define MAX_INPUT 100
相当于把MAX_INPUT设置为常量100,这个MAX_INPUT不能被修改,这些名字一般都大写,用于提醒他们与非普通的变量不同。

  1. 依次打印一个十进制整数、字符串和浮点值,你应该在printf函数中分别使用什么格式代码?试编一例,让这些打印值以空格分隔,并在输出行的末尾添加一个换行符。
   	#include<stdio.h>
   		int main(){
   			int a = 100;
   			char b[10] = "abcde";
   			float c = 17.111;
   			printf("%d %s %f\n", a, b, c);
   			return 1;
   		}

输出:100 abcde 17.100000

  1. 编写一条scanf语句,他需要读取两个整数,分别保存于quantity和price变量,然后再读取一个字符串,保存在一个名叫department的字符数组中。
#include<stdio.h>

int main(){

	int quantity, price;
	scanf( "%d%d", &quantity, &price );
	printf( "quantity: %d; price: %d\n", quantity, price );

	char department[100];
	fgets( department, 99, stdin );
	printf( "department: %s", department );
	
	return 0;
}

输入:100 90 abcdefg
输出:quantity:100;price:90
	 department:abcdefg
  1. C语言并不执行数组下标的有效性检查。你觉得为什么这个明显的安全手段会从语言中省略?

答:C的委员会为了强调C的灵活性 采用 充分相信程序员的做法 让程序员去保证程序的正确性

  1. 本章描述的rearrange程序包含下面的语句
    strncpy( output + output_col, input + columns[col], nchars );
    strcpy函数只接受两个参数,所以它实际上所复制的字符数由第二个参数指定。在本程序中,如果用strcpy函数取代strncpy函数会出现什么结果?

答:参考strncpy和strcpy的区别,略。

  1. rearrange程序包含下面的语句
    while( gets( input ) != NULL ) {
    你认为这段代码可能会出现什么问题?

答:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,从而造成程序崩溃或其他数据的错误。

**

1.8

**

  1. “Hello world!” 程序常常是C编程新手所写的第一个程序,它在标准输出中打印Hello world!,并在后面添加一个换行符。当你希望摸索出如何在自己的系统中运行C编译器时,这个小程序往往是一个很好的测试例。

答案:略。。。。。

  1. 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面要加上行号。在编写这个程序时要试图让程序能够处理的输入行的长度没有限制。
#include<stdio.h>

int main(){

	int num = 1;
	char c;
	
	while( 1 )
	{
		printf( "%d: ", num++ );
		
		while( ( c = getchar() ) != EOF )
		{
			if( c == '\n' )
			{
				printf( "\n\n" );
				break;
			} 
			else 
			{
				printf( "%c", c );
			}
		}
	}
		
	return 0;
}
输入:1: jjjjjjjjjj
输出:jjjjjjjjjj
  1. 编写一个程序,从标准输入读取一些字符,并把他们写到标准输出上,它同时应该计算checksum值,并写在字符的后面。
    checksum(检验和)用一个sunged char 类型的变量进行计算,它初始为-1.当每个字符从标准输入读取时,它的值就被加到checksum中。如果checksum变量产出了溢出,那么这些溢出就会被忽略。当所有的字符均被写入后,程序以十进制整数的形式打印出checksum的值,它有可能是负值。注意在checksum后面要添加一个换行符。在使用ASSII码的计算机中,在包含“Hello world!”这几个词并以换行符结尾的文件上运行这个程序,应该产生以下列输出:
    Hello world!
    102

答:参考我的另外一篇博文:
https://blog.csdn.net/u014380694/article/details/92665664

  1. 编写一个程序,一行行地读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,你可以假定所有的输入行均不超过1000个字符。
#include<stdio.h>
#include<string.h>

int main()
{
	char input[1000];
	int largest = 0, num = 0;

	while( fgets( input, 1000, stdin ) != NULL )
	{
	
		if( ( num = strlen( input ) ) > largest )
		{
			largest = num;
			printf( "Long: %d; String: ", largest );
			fputs( input, stdout );
		}
		
	}
	return 0;
}
  1. 6.都是修改原程序,略。。。。
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值