从不兼容的指针类型传递“fgets”的参数 3
Passing argument 3 of “fgets ” from incompatible pointer type
我的程序出现警告,我不知道如何解决。首先我收到警告 passing argument 3 of "fgets" from incompatible pointer type
。这是我的程序:
bool get_name(char name[],char buff[])
{
if(isalpha(buff))
{
fgets(name,sizeof(MAXNAME),buff);
return name;
}
else
{
return false;
}
}
回答标题中的问题
来自man page for fgets()
,签名是
char *fgets(char *s, int size, FILE *stream)
其中,第三个参数的类型为FILE *
。你不能在那里传递 char *
。
此外,引用 C11
,第 7.21.7.2 章
The fgets
function reads at most one less than the number of characters specified by n
from the stream pointed to by stream
into the array pointed to by s
. [...]
因此,它必须是 流 ,而不是 char
数组或其他格式的文件名。
注:
正如 Mr. Jonathan Leffler 在评论中正确提到的那样,从问题描述来看,您根本不需要在代码中使用 fgets()
。请先将问题陈述分解成笔和纸上的算法以消除混淆,然后再回来 re-write 代码。
鉴于任务描述:
- 复制一个以字母字符开头并以字母数字字符继续的字符串,从
buff
到 name
代码根本不应该使用 fgets()
。 (如果 fgets()
相关,请参阅问题的评论以讨论必要的内容。)代码应该类似于:
bool get_name(char name[], char buff[])
{
if (isalpha(buff[0]))
{
int i;
for (i = 0; isalnum(buff[i]); i++)
name[i] = buff[i];
name[i] = '[=10=]';
return true;
}
else
{
name[0] = '[=10=]';
return false;
}
}
此代码假定 name
足以容纳 buff
中的任何标识符。请注意,当 i
为 0 时,isalnum(buff[i])
测试将通过,但由于外部测试,检查的值将始终按字母顺序排列。
示例程序
#include <ctype.h>
#include <stdbool.h>
extern bool get_name(char name[], char buff[]);
bool get_name(char name[], char buff[])
{
if (isalpha(buff[0]))
{
int i;
for (i = 0; isalnum(buff[i]); i++)
name[i] = buff[i];
name[i] = '[=11=]';
return true;
}
else
{
name[0] = '[=11=]';
return false;
}
}
#include <assert.h>
#include <stdio.h>
static void test(char *buffer)
{
char name[64];
if (get_name(name, buffer))
printf("Got name [%s] from [%s]\n", name, buffer);
else
{
printf("No name in [%s]\n", buffer);
assert(name[0] == '[=11=]');
}
}
int main(void)
{
char buffer1[] = "Adelson23 and all that!";
char buffer2[] = "=not an identifier=";
test(buffer1);
test(buffer2);
return 0;
}
示例输出
Got name [Adelson23] from [Adelson23 and all that!]
No name in [=not an identifier=]
我的程序出现警告,我不知道如何解决。首先我收到警告 passing argument 3 of "fgets" from incompatible pointer type
。这是我的程序:
bool get_name(char name[],char buff[])
{
if(isalpha(buff))
{
fgets(name,sizeof(MAXNAME),buff);
return name;
}
else
{
return false;
}
}
回答标题中的问题
来自man page for fgets()
,签名是
char *fgets(char *s, int size, FILE *stream)
其中,第三个参数的类型为FILE *
。你不能在那里传递 char *
。
此外,引用 C11
,第 7.21.7.2 章
The
fgets
function reads at most one less than the number of characters specified byn
from the stream pointed to bystream
into the array pointed to bys
. [...]
因此,它必须是 流 ,而不是 char
数组或其他格式的文件名。
注:
正如 Mr. Jonathan Leffler 在评论中正确提到的那样,从问题描述来看,您根本不需要在代码中使用 fgets()
。请先将问题陈述分解成笔和纸上的算法以消除混淆,然后再回来 re-write 代码。
鉴于任务描述:
- 复制一个以字母字符开头并以字母数字字符继续的字符串,从
buff
到name
代码根本不应该使用 fgets()
。 (如果 fgets()
相关,请参阅问题的评论以讨论必要的内容。)代码应该类似于:
bool get_name(char name[], char buff[])
{
if (isalpha(buff[0]))
{
int i;
for (i = 0; isalnum(buff[i]); i++)
name[i] = buff[i];
name[i] = '[=10=]';
return true;
}
else
{
name[0] = '[=10=]';
return false;
}
}
此代码假定 name
足以容纳 buff
中的任何标识符。请注意,当 i
为 0 时,isalnum(buff[i])
测试将通过,但由于外部测试,检查的值将始终按字母顺序排列。
示例程序
#include <ctype.h>
#include <stdbool.h>
extern bool get_name(char name[], char buff[]);
bool get_name(char name[], char buff[])
{
if (isalpha(buff[0]))
{
int i;
for (i = 0; isalnum(buff[i]); i++)
name[i] = buff[i];
name[i] = '[=11=]';
return true;
}
else
{
name[0] = '[=11=]';
return false;
}
}
#include <assert.h>
#include <stdio.h>
static void test(char *buffer)
{
char name[64];
if (get_name(name, buffer))
printf("Got name [%s] from [%s]\n", name, buffer);
else
{
printf("No name in [%s]\n", buffer);
assert(name[0] == '[=11=]');
}
}
int main(void)
{
char buffer1[] = "Adelson23 and all that!";
char buffer2[] = "=not an identifier=";
test(buffer1);
test(buffer2);
return 0;
}
示例输出
Got name [Adelson23] from [Adelson23 and all that!]
No name in [=not an identifier=]