getchar/putchar、gets/puts 和 fgets/fputs(在 C 语言中)有什么区别?
What is the difference between getchar/putchar, gets/puts and fgets/fputs (in C)?
我目前正在研究 C 中的输入和输出,我发现大约有十亿种不同的方式来获取输入,例如 getch、getchar、gets 和 fgets,输出也是如此(putchar, puts、fputs 等)。
I/O这些不同的方法让我很困惑,所以我来这里问一下上述功能之间的基本区别是什么。
我还使用这些不同的函数编写了一些代码,并根据我所学的知识评论了我认为它们的工作方式,但我不确定我的理解是否正确。我也在其他地方读过它们,但是解释非常复杂而且似乎不连贯。
所以谁能告诉我我是否正确使用它们,如果没有正确使用它们,我应该如何使用它们以及它们之间的主要区别是什么?
这是我的代码:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
void individualCharacters()
{
char theChar;
while ((theChar = getchar()) != '~') { // getchar() stores all characters in a line buffer as it is entered until newline is entered
putchar(theChar); // putchar() prints the characters in the line buffer and does not print a newline, line buffering depends on compiler
}
}
void withoutF()
{
char name[50];
printf("What is your name? ");
gets(name); // receives a string until newline is entered, newline is then replaced with string terminator, array limit should not be passed
puts("Hi"); // only prints one string at a time and adds the newline because gets() previously replaces the newline
puts(name);
}
void withF()
{
char name[50];
printf("What is your name? ");
fgets(name, 50, stdin); // does add a newline so the newline takes up one space in the array, it stores input until either newline is entered or array limit is reached
fputs("Hi ", stdout); // does not print a newline but prints the string input up to the array limit
fputs(name, stdout);
}
void main()
{
//sum();
//individualCharacters();
//withoutF();
//withF();
//printRandomString();
}
这些只是我编写的一些以不同方式获取输入和显示输出的函数,但我无法理解为什么有这么多不同的方式。
如果我在使用 I/O 函数时有任何错误,请随时告诉我,以便我进行修改。
谢谢
getch()
是一个提示按键的函数,其中的字符不回显。
相比之下,getche()
将回显该字符。
gets()
将从 stdin
中读取字符,但不安全(请改用 fgets()
)。
getchar()
将从 stdin
读取的下一个字符 return,这与使用 stdin
作为参数调用 getc()
相同。
fgets()
从流中读取字符(如文件或 stdin
),并将它们作为 C 字符串存储到 str
中,直到读取了 (num-1) 个字符或到达换行符或 EOF
。
putch()
将一个字符写入 stdout
。这与使用 stdout
作为参数调用 putc()
相同。
puts()
将 str
指向的 C 字符串写入 stdout
并附加一个换行符。它开始复制直到到达空终止符 ([=30=]
)。不打印空终止符。
fputs()
将 str
指向的 C 字符串写入流,本质上类似于 puts()
至于你的代码,尽量避免使用gets()
,因为它是不安全的,使用scanf()
,同样适用于puts()
。请改用 printf()
。
在这里,读一读:http://www.cplusplus.com/reference/cstdio/
我知道它是 C++ 参考,但库函数是相同的
fgets
char * fgets ( char * str, int num, FILE * stream );
Get string from stream
从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或到达文件末尾,以先到者为准。
换行符会使 fgets 停止读取,但它被认为是有效字符,因此包含在复制到 str 的字符串中。
读取字符后会自动在 str 中附加一个空字符,以表示 C 字符串结束。
fputs
int fputs ( const char * str, FILE * stream );
Write string to stream
将str指向的字符串写入流。
该函数从指定地址 (str) 开始复制,直到到达终止空字符 ('\0')。这个最终的空字符不会复制到流中。
getchar
function
<cstdio>
int getchar ( void );
从标准输入获取字符。
Returns 来自标准输入 (stdin) 的下一个字符。
它等同于以 stdin 作为参数的 getc。
putchar
function
<cstdio>
int putchar ( int character );
将字符写入标准输出
将字符写入标准输出 (stdout) 中的当前位置,并将内部文件位置指示器前进到下一个位置。
它等同于 putc(character,stdout).
gets
: 从标准输入到内存
puts
: 从内存到标准输入
Example :
#include<stdio.h>
void main( )
{
char name[10];
printf("What is your first and last name?");
gets(name);
puts(name);
}
fgets
- 从指定的流中读取最多 SIZE-1
个字符到缓冲区,如果有空间,包括尾随的换行符。在缓冲区末尾添加一个 0 终止符,使其成为有效的 C 字符串:
char buffer[SIZE];
if ( fgets( buffer, sizeof buffer, stdin ) ) // read from standard input
do_something_with( buffer );
else
error();
成功时,fgets
returns 输入缓冲区的地址。在失败或文件结束时,它 returns NULL
。
fgetc
- 从指定的输入流中读取 单个字符 并且 returns 它:
FILE *input_stream = fopen( "some_file", "r" );
int c;
while ( (c = fgetc( input_stream )) != EOF )
do_something_with( c );
gets
- 在 C99 之后被弃用,从 C2011 中完全删除。与 fgets
一样,它会从标准输入中读取一系列字符到缓冲区并添加一个 0 终止符,但与 fgets
不同的是,它没有提供限制输入的机制,因此成为一种流行的恶意软件利用方式。此外,它不会将尾随换行符存储到缓冲区。使用它肯定会在您的代码中引入故障点。假装你从未听说过它。
getc
- 与 fgetc
相同,只是它可以作为宏实现。
getchar
- 从标准输入中读取单个字符:
int c;
...
while( (c = getchar()) != EOF )
do_something_with( c );
fputs
- 将字符串写入指定的输出流:
char str[SIZE];
...
fputs( str, output_stream );
fputc
- 将单个字符写入指定的输出流:
while ( i < strsize )
fputc( str[i], output_stream );
putc
- 与 fputc
相同,只是它可以作为宏实现
putchar
- 将单个字符写入标准输出。
我目前正在研究 C 中的输入和输出,我发现大约有十亿种不同的方式来获取输入,例如 getch、getchar、gets 和 fgets,输出也是如此(putchar, puts、fputs 等)。
I/O这些不同的方法让我很困惑,所以我来这里问一下上述功能之间的基本区别是什么。
我还使用这些不同的函数编写了一些代码,并根据我所学的知识评论了我认为它们的工作方式,但我不确定我的理解是否正确。我也在其他地方读过它们,但是解释非常复杂而且似乎不连贯。
所以谁能告诉我我是否正确使用它们,如果没有正确使用它们,我应该如何使用它们以及它们之间的主要区别是什么?
这是我的代码:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
void individualCharacters()
{
char theChar;
while ((theChar = getchar()) != '~') { // getchar() stores all characters in a line buffer as it is entered until newline is entered
putchar(theChar); // putchar() prints the characters in the line buffer and does not print a newline, line buffering depends on compiler
}
}
void withoutF()
{
char name[50];
printf("What is your name? ");
gets(name); // receives a string until newline is entered, newline is then replaced with string terminator, array limit should not be passed
puts("Hi"); // only prints one string at a time and adds the newline because gets() previously replaces the newline
puts(name);
}
void withF()
{
char name[50];
printf("What is your name? ");
fgets(name, 50, stdin); // does add a newline so the newline takes up one space in the array, it stores input until either newline is entered or array limit is reached
fputs("Hi ", stdout); // does not print a newline but prints the string input up to the array limit
fputs(name, stdout);
}
void main()
{
//sum();
//individualCharacters();
//withoutF();
//withF();
//printRandomString();
}
这些只是我编写的一些以不同方式获取输入和显示输出的函数,但我无法理解为什么有这么多不同的方式。
如果我在使用 I/O 函数时有任何错误,请随时告诉我,以便我进行修改。
谢谢
getch()
是一个提示按键的函数,其中的字符不回显。
相比之下,getche()
将回显该字符。
gets()
将从 stdin
中读取字符,但不安全(请改用 fgets()
)。
getchar()
将从 stdin
读取的下一个字符 return,这与使用 stdin
作为参数调用 getc()
相同。
fgets()
从流中读取字符(如文件或 stdin
),并将它们作为 C 字符串存储到 str
中,直到读取了 (num-1) 个字符或到达换行符或 EOF
。
putch()
将一个字符写入 stdout
。这与使用 stdout
作为参数调用 putc()
相同。
puts()
将 str
指向的 C 字符串写入 stdout
并附加一个换行符。它开始复制直到到达空终止符 ([=30=]
)。不打印空终止符。
fputs()
将 str
指向的 C 字符串写入流,本质上类似于 puts()
至于你的代码,尽量避免使用gets()
,因为它是不安全的,使用scanf()
,同样适用于puts()
。请改用 printf()
。
在这里,读一读:http://www.cplusplus.com/reference/cstdio/
我知道它是 C++ 参考,但库函数是相同的
fgets
char * fgets ( char * str, int num, FILE * stream );
Get string from stream
从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或到达文件末尾,以先到者为准。 换行符会使 fgets 停止读取,但它被认为是有效字符,因此包含在复制到 str 的字符串中。 读取字符后会自动在 str 中附加一个空字符,以表示 C 字符串结束。
fputs
int fputs ( const char * str, FILE * stream );
Write string to stream
将str指向的字符串写入流。 该函数从指定地址 (str) 开始复制,直到到达终止空字符 ('\0')。这个最终的空字符不会复制到流中。
getchar
function
<cstdio>
int getchar ( void );
从标准输入获取字符。 Returns 来自标准输入 (stdin) 的下一个字符。 它等同于以 stdin 作为参数的 getc。
putchar
function
<cstdio>
int putchar ( int character );
将字符写入标准输出 将字符写入标准输出 (stdout) 中的当前位置,并将内部文件位置指示器前进到下一个位置。 它等同于 putc(character,stdout).
gets
: 从标准输入到内存
puts
: 从内存到标准输入
Example :
#include<stdio.h>
void main( )
{
char name[10];
printf("What is your first and last name?");
gets(name);
puts(name);
}
fgets
- 从指定的流中读取最多 SIZE-1
个字符到缓冲区,如果有空间,包括尾随的换行符。在缓冲区末尾添加一个 0 终止符,使其成为有效的 C 字符串:
char buffer[SIZE];
if ( fgets( buffer, sizeof buffer, stdin ) ) // read from standard input
do_something_with( buffer );
else
error();
成功时,fgets
returns 输入缓冲区的地址。在失败或文件结束时,它 returns NULL
。
fgetc
- 从指定的输入流中读取 单个字符 并且 returns 它:
FILE *input_stream = fopen( "some_file", "r" );
int c;
while ( (c = fgetc( input_stream )) != EOF )
do_something_with( c );
gets
- 在 C99 之后被弃用,从 C2011 中完全删除。与 fgets
一样,它会从标准输入中读取一系列字符到缓冲区并添加一个 0 终止符,但与 fgets
不同的是,它没有提供限制输入的机制,因此成为一种流行的恶意软件利用方式。此外,它不会将尾随换行符存储到缓冲区。使用它肯定会在您的代码中引入故障点。假装你从未听说过它。
getc
- 与 fgetc
相同,只是它可以作为宏实现。
getchar
- 从标准输入中读取单个字符:
int c;
...
while( (c = getchar()) != EOF )
do_something_with( c );
fputs
- 将字符串写入指定的输出流:
char str[SIZE];
...
fputs( str, output_stream );
fputc
- 将单个字符写入指定的输出流:
while ( i < strsize )
fputc( str[i], output_stream );
putc
- 与 fputc
相同,只是它可以作为宏实现
putchar
- 将单个字符写入标准输出。