C和指针 第1章 快速上手 1.7 问题

1.7 问题
问题1.C是一种自由形式的语言,也就是说,并没有规则规定它的外观究竟应该怎样?但本章例子程序遵循了一定的空白使用规则,你对此有何想法?
 解析:
1.更好地显示程序的结构。 
2.使代码更加容易阅读和修改。
问题2.把声明(如函数的原型的声明)放在头文件中,并在需要时用#include指令把它们包含于源文件中,这种做法有什么好处?
解析:
1.只需要这些声明的一份副本,无须在许多不同的地方进行复制,避免了在维护这些代码时出现错误的可能性。
问题3.使用#define指令给字面值常量取名有什么好处?
解析:
1.字面量常量取名一般都大写,可以提醒它们并非普通的变量。 
2.只需在一处修改,其他地方的字面值常量会自动修改。
问题4.用printf函数分别使用什么格式代码依次打印一个十进制整数、字符串和浮点值,并让这些打印值以空格分隔,并在输出末尾添加一个换行符。
解析:
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    int i = 1;
    const char *str = "hello!"; 
    float f = 1.0f;
    
    printf( "%d %s %f\n", i, str, f ); /*i是一个整数,str是一个字符串,f是一个浮点数*/

    return EXIT_SUCCESS;
}
输出:

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

int main( void ){
    int quantity;
    int price;
    char department[100]; 
    
    scanf( "%d %d %s", &quantity, &price, department );
    printf( "quantity = %d, price = %d, department = %s\n", quantity, price, department );

    return EXIT_SUCCESS;
}
输出:    

问题6. C语言并不执行数组下标的有效性检查。你觉得为什么这个明显的安全手段会从语言中省略?
解析:
因为下标检查在C中是一项困难的任务。标准并未提出这项要求。困难的原因在于下标引用可以作用于任意的指针,而不仅仅是数组名。作用于指针的下标引用的该指针当时恰好指向什么内容,也依赖于下标的值。
结果,C的下标检查所涉及的开销比刚开始想象的更多。编译器必须在程序中插入指令,证实下标表达式的结果所引用的元素和指针表达式所指向的元素属于同一个数组。这个比较操作需要程序中所有数组的位置和长度方面的信息,这将占用一些空间。当程序运行时,这些信息必须进行更新,以反映自动和动态分配的数组,这又将占有一定的时间。因此,即使是那些提供了下标检查的编译器通常也会提供一个开关,允许去掉下标检查。
问题7.使用strcpy代替strncpy函数会出现什么后果?
解析:
可能会导致超出目标数组容量的限制,从而导致目标数组后面的内存位置的内容被修改,造成意外的结果。
问题8.while( gets( input ) != NULL )可能会导致什么问题?
当一个数组作为函数的参数进行传递时,函数无法知道它的长度。因此,gets函数没有办法防止一个非常长的输入行,从而导致input数组溢出。fgets函数要求数组的长度作为参数传递给它,因此不存在这个问题。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值