【问题标题】:How to understand C programming like linguistics - C Library如何像语言学一样理解 C 编程 - C 库
【发布时间】:2011-08-01 21:42:55
【问题描述】:

我正在学习 C,我正在尝试理解库。

例如,在 GNU C 库中,它给出:

——函数:char * fgets(char *s, int 计数,文件*流)

fgets 函数读取字符 从流向上 到并包括换行符 并将它们存储在字符串 s 中, 添加一个空字符来标记 字符串的结尾。你必须提供 计算 s 中值得空格的字符, 但读取的字符数是 最多计数 - 1. 额外的字符 空间用于保存空 字符串末尾的字符。

如果系统已经在文件末尾 当您调用 fgets 时,则 数组 s 的内容不变 并返回一个空指针。一个空 如果读取也返回指针 发生错误。否则返回 value 是指针 s。

警告:如果输入数据为空 性格,你说不出来。所以 不要使用 fgets 除非你知道 数据不能包含空值。不要使用 它读取用户编辑的文件 因为,如果用户插入一个 null 字符,你应该处理它 正确或打印明确的错误 信息。我们建议使用 getline 而不是 fgets。

但是,我仍然看到人们使用 fgets 从控制台收集输入而不是文件,例如:

fgets(line,sizeof(line),stdin);
sscanf(line,"%d",&current); // read the input

有人可以向我解释我应该如何阅读和遵循 C 语言的语法吗?您应该通过模仿他人的代码来学习 C 还是通过实际引用库然后自己编写代码来学习 C?

干杯,

【问题讨论】:

  • 注意:fgets等做的和C语法无关,和标准库有关。
  • 他们所说的 getline 函数here 是该特定库中的非标准扩展。我认为,对于可移植代码,你最好坚持使用 fgets。
  • @jonsca:好吧,getline() 被添加到 POSIX 2008 中。这使得它对于 vanilla c 仍然是非标准的,但在类 unix 系统上是标准的,fgets 是可怕的。跨度>
  • @dmckee 我一直认为可移植性是最重要的,但我理解你的意思。我从未见过 getline 的代码,所以我不知道它与实现有何联系。但是,我确实认为向不熟悉该语言的人强调 fgets 在安全性上优于不带字段宽度说明符的 gets() 或 scanf(使用 %s)是很重要的。
  • @jonsca:关于fgets 的安全性提高,您当然是对的。我已经使用纯 c89 库函数实现了getline 语义,GNU 使它们的版本与它们的 libc 分开提供(尽管显然在 GPL 下)。

标签: c


【解决方案1】:

stdin 一个FILE *类型的变量,它在<stdio.h>中定义。 用于从standard input读取数据。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2022-06-14
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多