从不兼容的指针类型传递“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 代码。

鉴于任务描述:

  • 复制一个以字母字符开头并以字母数字字符继续的字符串,从 buffname

代码根本不应该使用 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=]