2

阅读 K&R 后,除了熟悉的 printf、scanf、getchar 等之外,C 中似乎还有很多 I/O 函数。此外,其中一些函数还有一些细微差别,例如是否存储了 '\n' 字符, EOF 或 NULL 是错误返回,默认输入流(标准输入/键盘)等。这里是我能够想出的 I/P 函数列表:

I/P 函数: scanf fscanf getchar fgetc getc gets

当我单独阅读他们的描述时,我似乎明白了,但如果我必须选择一个而不是另一个,我会感到困惑,一切都会在我的脑海中变得混乱,如果你知道我的意思的话。谁能清楚地总结何时使用哪种功能以及选择一个而不是另一个的优缺点(getchar vs getc vs scanf)?

奖励点:K&R 的 getline 函数在上述场景中适用于何处?

4

1 回答 1

3

Input 和 Output 之间的区别在 OP 中很明显,所以让我们关注其他的。

差异 1:有些函数采用 a FILE*,有些会假设一个:stdint用于输入,stdout用于输出)。如果您打算使用这些stdin/stdout文件,只需使用更简单的文件:

  • FILE*: fprintf, fscanf, fgetc, fgets, fputc, fputs.
  • 请勿服用FILE*printf、、、、、、、。scanf_ getchar_ gets_putcharputs

注意图案?f以...开头的函数FILE*例外是putcgetc,它们等价于它们的f*对应物。只是不要使用它们......它们很奇怪。

区别 2:有些函数格式化参数,有些采用单个字符,有些采用字符串。这很容易看到,我懒得再次列举它们。使用最适合你的东西。

区别3:根本不应该使用某些功能。IMO 他们是getc, putc, gets, puts. 它们分别是怪异的、怪异的、不可能正确使用的和怪异的。

区别4:返回值。所有函数都返回int读/写字符(或EOF出错),除了:

  • fgets并且gets返回与它们作为参数(或NULL如果错误)相同的指针。这被认为可以方便地节省代码行:memcpy(buffer, fgets(buffer2, 100, file));. 但是由于您应该在使用指针之前检查错误,因此实际返回值除了将其与NULL.
  • *printf返回写入的字节数。
  • *scanf返回读取的输入项数。

好吧,这不是一张桌子,而是 IHTH。

于 2013-07-04T16:13:52.227 回答