Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lcthw-zh
提交
ab6cf07a
L
lcthw-zh
项目概览
OpenDocCN
/
lcthw-zh
8 个月 前同步成功
通知
2
Star
18
Fork
5
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
lcthw-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ab6cf07a
编写于
8月 02, 2016
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
typo
上级
17101f08
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
4 addition
and
4 deletion
+4
-4
ex24.md
ex24.md
+3
-3
ex8.md
ex8.md
+1
-1
未找到文件。
ex24.md
浏览文件 @
ab6cf07a
...
...
@@ -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`
的地址,便于
`fs
c
naf`
获得它的指针来修改它。这是一个很好的例子,解释了使用指向数据的指针作为“输出参数”。
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`
来使其变小。
...
...
ex8.md
浏览文件 @
ab6cf07a
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录