在C中,input = fgets(input,sizeof(input),*pt)是一个错误吗?

问题描述 投票:0回答:2

在 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);
c fgets
2个回答
3
投票

事实上,如果成功,函数

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
调用可能会导致内存泄漏,因为分配的内存地址将由于指针被空值重新分配而丢失。


0
投票

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
,这会爆炸,所以它没有被使用那么多。

© www.soinside.com 2019 - 2024. All rights reserved.