使用scanf()时要小心

使用scanf()时要小心 - 图1

scanf()函数有一个小毛病。到目前为止,你写过的所有代码都小心翼翼地限制了scanf()能读入的字符数:

  1. scanf("%39s", name);
  2. scanf("%2s", card_name);

为什么要这样做?毕竟scanf()用了和printf()一样的格式串,但当我们用printf()打印字符串时,只用了%s。如果在scanf()中只用%s,一旦用户输入得太起劲,就会出问题:

  1. char food[5];
  2. printf("Enter favorite food: ");
  3. scanf("%s", food);
  4. printf("Favorite food: %s\n", food);

使用scanf()时要小心 - 图2

程序崩溃了,因为scanf()在写数据时越过了food数组的尾部。

使用scanf()时要小心 - 图3

scanf()会导致缓冲区溢出

如果忘了限制scanf()读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。如果运气好,数据不但能保存,而且不会有任何问题。

但缓冲区溢出很有可能会导致程序出错,这种情况通常被称为段错误或abort trap,不管出现什么错误消息,程序都会崩溃