使用scanf()时要小心
scanf()
函数有一个小毛病。到目前为止,你写过的所有代码都小心翼翼地限制了scanf()
能读入的字符数:
scanf("%39s", name);
scanf("%2s", card_name);
为什么要这样做?毕竟scanf()
用了和printf()
一样的格式串,但当我们用printf()
打印字符串时,只用了%s
。如果在scanf()
中只用%s
,一旦用户输入得太起劲,就会出问题:
char food[5];
printf("Enter favorite food: ");
scanf("%s", food);
printf("Favorite food: %s\n", food);
程序崩溃了,因为scanf()
在写数据时越过了food
数组的尾部。
scanf()会导致缓冲区溢出
如果忘了限制scanf()
读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。如果运气好,数据不但能保存,而且不会有任何问题。
但缓冲区溢出很有可能会导致程序出错,这种情况通常被称为段错误或abort trap,不管出现什么错误消息,程序都会崩溃。