CodeMan

Each of us must find a way to love the world. You have found yours.

0%

c与指针第一章练习

1.7 问题

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

1
2
3

A: 很显然,规则格式更有利于代码的阅读与维护。一堆没办法阅读的代码质量就跟一堆💩没区别。

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

1
2
3

A: 这样可以避免重复的声明代码。也有利于代码块重用。

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

1
2
3
4
A: 有两个原因
1. 如果在不同的地方引用了常量,后续改动常量只需要在define处改动即可,不需要满到处改定义值。
2. define指令可以给常值赋予有意义的名字,以达到见名知义的作用。

4.依次打印一个十进制整数、字符串和浮点值,你应该在printf函数中分别使用什么格式代码?试编一例,让这些打印值以空格分隔,并在输出行的末尾加一个换行符。

1
2
3
4
5
#include <stdio.h>

int main(int argc, char *argv[]) {
printf("%d %s %g \n",6);
}

输出结果:
6 £∆Ø·˛ 0


Q: 新问题出来了为什么以字符串打印会是乱码呢?

5.编写一条scanf语句,它需要读取两个整数,分别保存于quantity和nice变量,然后再读取一个字符串,保存在一个名叫department的字符数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main(int argc, char *argv[]) {
int quantity;
int nice;
char department[100];

scanf("%d",&quantity);
scanf("%d",&nice);
printf("quantity: %d\tnice:%d\n",quantity,nice);

scanf("%s",&department);
printf("department:%s",department);
}

输出结果:
12
23
quantity: 12 nice:23
test
department:test


  1. C语言并不执行数组下标的有效性检查。你觉得为什么这个明显的安全手段会从语言中省略?
  1. 本章描述的rearrange程序包含下面的语句
1
strncpy(output _ output_col, input + columns[col],nchars);

strcpy函数只接受两个参数,所以它实际上所复制的字符数由第2个参数指定。在本程序中,如果用strcpy函数取代strncpy函数会出现什么结果?

8.rearrange程序包含下面的语句

1
while( gets(input) != NULL){

你认为这段代码可能会出现什么问题?

1.8编程练习

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

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

  3. 编写一个程序,从标准输入读取一些字符,并把它们写到标准输出上。它同时应该计算checksum值,并写在字符的后面。checksum(检验和)用一个singed char类型的变量进行计算,它初始为-1.当每个字符从标准输入读取时,它的值就被加到checksum中。如果checksum变量产生了溢出,那么这些溢出就会被忽略。当所有的字符均被写入后,程序以十进制整数的形式打印出checksum的值,它有可能是负值。注意在checksum后面要添加一个换行符。在使用ASCII码的计算机中,在包含”Hello world!”这几个词并以换行符结尾的文件上运行这个程序应该产生下列输出:
    Hello world!
    102

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

  5. rearrange程序中的下列语句

1
2
if( columns[col] >= len ...)
break;

当字符的列范围超出输入行的末尾时就停止复制,这条语句只有当列范围以递境顺序出现时才是正确的,但事上并不一定如此。请修改这条语句,即使列范围不是按顺序读取也能正确完成任务。

  1. 修改rearrange程序,去除输入中列标号的个数必须是偶数的限制。 如果读入的列桔为奇数个,函数就会把最后一个列范围设置为最后一个列标号所指定的列到行尾之间的范围。从最后一个列标号至行尾的所有字符都将被复制到输出字符串