在 C 编程中,当我们为 fgets 函数传递参数 *pointer_for_string、sizeof_string 和 *stream 时,我们不必将函数的返回值写回到之前定义/给出的 *pointer_for_array 中,这是否正确? fgets 的参数。
为什么会是一个错误?
char string_ofsize_ten[10];
string_ofsize_ten = fgets(string_ofsize_ten, 10, stdin);
事实上,如果成功,函数
fgets
会返回传递给它的指针(如果将数组用作参数,它会隐式转换为指向其第一个元素的指针)作为第一个参数。但是您不能将指针分配给数组,因为它是在代码片段中编写的
char string_ofsize_ten[10];
string_ofsize_ten = fgets(string_ofsize_ten, 10, stdin);
数组是不可修改的左值。
再次注意,在调用上面的函数
fgets
时,用作参数的数组被隐式转换为指向其第一个参数的指针。
返回的指针用于检查 fgets 调用是否成功,例如
while ( fgets(string_ofsize_ten, sizeof( string_ofsize_ten ), stdin) != NULL )
{
string_ofsize_ten[ strcspn( string_ofsize_ten, "\n" ) ] = '\0';
puts( string_ofsize_ten );
}
另一方面,如果您使用的是指向动态分配内存的指针,例如
char *string_ofsize_ten = malloc( 10 );
string_ofsize_ten = fgets(string_ofsize_ten, 10, stdin);
那么如果函数返回空指针,这样的
fgets
调用可能会导致内存泄漏,因为分配的内存地址将由于指针被空值重新分配而丢失。
像
array_ofsize_ten
这样的数组表达式不能作为赋值的目标;语言根本不允许这样做。 fgets
将写入数组作为其操作的一部分,因此您不需要将结果分配回原始数组。
返回值主要用于测试操作是否成功;如果在输入流中任何字符之前看到 EOF 或错误,
fgets
将返回 NULL
:
if ( fgets( target, sizeof target, stream ) ) // implicit test against NULL
{
// process target
}
else if ( feof( stream ) )
{
// handle EOF
}
else
{
// handle I/O error
}
您还可以将该返回值作为参数传递给另一个需要
char *
: 的函数
printf( "%s\n", fgets( target, sizeof target, stream ) );
尽管如果
fgets
返回 NULL
,这会爆炸,所以它没有被使用那么多。