**
1.7
**
- C是一种自由形式的语言,也就是说并没有规则规定它的外观究竟应该怎样。但本章的例子程序遵循了一定的空白使用规则。你对此有何看法?
答:空行将程序的不同部分分隔开来;制表符(tab)用于缩进语句,更好地显示程序的结构等等。C是一种自由格式的语言,并没有规则要求你必须怎样书写语句。然而,如果你在编写程序时能够遵守一些约定还是非常值得的,它可以使代码更加容易阅读和修改。
- 把声明(如函数原型的声明)放在头文件中,并在需要时用#include指令把他们包含于源文件中,这种做法有什么好处?
答:#include指令叫做预处理指令,它们是由预处理器解释的,预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。例如:预处理器用名叫stdio.h的库函数头文件的内容替换#include<stdio.h>指令,其结果就相当于把stdio.h复制道文件中。好处:如果你有一些声明需要用于几个不同的源文件,你在一个单独的文件中编写这些声明,然后用#include指令把这个文件包含道需要使用这些声明的源文件中。这样,你就只需要这些声明的一份拷贝,用不着再许多不同的地方进行复制,避免了再维护这些代码时出现错误的可能性。
- 使用#define指令给字面值常量取名有什么好处?
答:#define也是预处理指令的一种,例子:#define MAX_INPUT 100
相当于把MAX_INPUT设置为常量100,这个MAX_INPUT不能被修改,这些名字一般都大写,用于提醒他们与非普通的变量不同。
- 依次打印一个十进制整数、字符串和浮点值,你应该在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
- 编写一条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
- C语言并不执行数组下标的有效性检查。你觉得为什么这个明显的安全手段会从语言中省略?
答:C的委员会为了强调C的灵活性 采用 充分相信程序员的做法 让程序员去保证程序的正确性
- 本章描述的rearrange程序包含下面的语句
strncpy( output + output_col, input + columns[col], nchars );
strcpy函数只接受两个参数,所以它实际上所复制的字符数由第二个参数指定。在本程序中,如果用strcpy函数取代strncpy函数会出现什么结果?
答:参考strncpy和strcpy的区别,略。
- rearrange程序包含下面的语句
while( gets( input ) != NULL ) {
你认为这段代码可能会出现什么问题?
答:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,从而造成程序崩溃或其他数据的错误。
**
1.8
**
- “Hello world!” 程序常常是C编程新手所写的第一个程序,它在标准输出中打印Hello world!,并在后面添加一个换行符。当你希望摸索出如何在自己的系统中运行C编译器时,这个小程序往往是一个很好的测试例。
答案:略。。。。。
- 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面要加上行号。在编写这个程序时要试图让程序能够处理的输入行的长度没有限制。
#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
- 编写一个程序,从标准输入读取一些字符,并把他们写到标准输出上,它同时应该计算checksum值,并写在字符的后面。
checksum(检验和)用一个sunged char 类型的变量进行计算,它初始为-1.当每个字符从标准输入读取时,它的值就被加到checksum中。如果checksum变量产出了溢出,那么这些溢出就会被忽略。当所有的字符均被写入后,程序以十进制整数的形式打印出checksum的值,它有可能是负值。注意在checksum后面要添加一个换行符。在使用ASSII码的计算机中,在包含“Hello world!”这几个词并以换行符结尾的文件上运行这个程序,应该产生以下列输出:
Hello world!
102
答:参考我的另外一篇博文:
https://blog.csdn.net/u014380694/article/details/92665664
- 编写一个程序,一行行地读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,你可以假定所有的输入行均不超过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;
}
- 6.都是修改原程序,略。。。。