提交 ab6cf07a 编写于 作者: W wizardforcel

typo

上级 17101f08
......@@ -4,7 +4,7 @@
> 译者:[飞龙](https://github.com/wizardforcel)
你已经学会了使用`printf`来打印变量,这非常不错,但是还需要学习更多。这个练习中你会用到`fscanf``fgets`在结构体构建关于一个人的信息。在这个关于读取输入的简介之后,你会得到C语言IO函数的完整列表。其中一些你已经见过并且使用过了,所以这个练习也是一个记忆练习。
你已经学会了使用`printf`来打印变量,这非常不错,但是还需要学习更多。这个练习中你会用到`fscanf``fgets`在结构体构建关于一个人的信息。在这个关于读取输入的简介之后,你会得到C语言IO函数的完整列表。其中一些你已经见过并且使用过了,所以这个练习也是一个记忆练习。
```c
#include <stdio.h>
......@@ -98,7 +98,7 @@ ex24.c:34-36
ex24.c:38-39
使用`fscanf`来从`stdin`读取整数,并且将其放到`you.age`中。你可以看到,其中使用了和`printf`相同格式的格式化字符串。你也应该看到传入了`you.age`的地址,便于`fsnaf`获得它的指针来修改它。这是一个很好的例子,解释了使用指向数据的指针作为“输出参数”。
使用`fscanf`来从`stdin`读取整数,并且将其放到`you.age`中。你可以看到,其中使用了和`printf`相同格式的格式化字符串。你也应该看到传入了`you.age`的地址,便于`fscnaf`获得它的指针来修改它。这是一个很好的例子,解释了使用指向数据的指针作为“输出参数”。
ex24.c:41-45
......@@ -147,7 +147,7 @@ Income: 1.234500
这个程序非常不错,但是这个练习中真正重要的部分是,`scanf`如何发生错误。对于简单的数值转换没有问题,但是对于字符串会出现问题,因为`scanf`在你读取之前并不知道缓冲区有多大。类似于`gets`的函数(并不是`fgets`,不带`f`的版本)也有一个我们已经避免的问题。它并不是道输入缓冲区有多大,并且可能会使你的程序崩溃。
要演示`fscanf`和字符串的这一问题,需要修改使用`fgets`的那一行,使它变成`fscanf(stdin, "%50s", you.first_name)`,并且城市再次运行。你会注意到,它读取了过多的内容,并且吃掉了你的回车键。这并不是你期望它所做的,你应该使用`fgets`而不是去解决古怪的`scanf`问题。
要演示`fscanf`和字符串的这一问题,需要修改使用`fgets`的那一行,使它变成`fscanf(stdin, "%50s", you.first_name)`,并且尝试再次运行。你会注意到,它读取了过多的内容,并且吃掉了你的回车键。这并不是你期望它所做的,你应该使用`fgets`而不是去解决古怪的`scanf`问题。
接下来,将`fgets`改为`gets`,接着使用`valgrind`来执行`valgrind ./ex24 < /dev/urandom`,往你的程序中输入一些垃圾字符串。这叫做对你的程序进行“模糊测试”,它是一种不错的方法来发现输入错误。这个例子中,你需要从`/dev/urandom`文件来输入一些垃圾,并且观察它如何崩溃。在一些平台上你需要执行数次,或者修改`MAX_DATA`来使其变小。
......
......@@ -4,7 +4,7 @@
> 译者:[飞龙](https://github.com/wizardforcel)
在上一个练习中你做了一些算术运算,不过带有`'\0'`(空)字符。这对于其它语言来说非常奇怪,因为它们把“字符串”和“字节数组”看做不同的东西。但是C中的字符串就是字节数组,并且只有不同的打印函数才知道它们的不同。
在上一个练习中你做了一些算术运算,并且使用了`'\0'`(空)字符。这对于其它语言来说非常奇怪,因为它们把“字符串”和“字节数组”看做不同的东西。但是C中的字符串就是字节数组,并且只有不同的打印函数才知道它们的不同。
在我真正解释其重要性之前,我先要介绍一些概念:`sizeof`和数组。下面是我们将要讨论的一段代码:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册