C语言 为什么 int 返回类型函数可以返回字符串?



这就是我要说的函数:

static int getInput()
{
printf("Enter your name: ");
return fgets(input, sizeof(input), stdin) != NULL;
}

这是如何工作的?为什么 int 返回类型可以使用这样的 fgets?

">为什么int返回类型函数可以返回字符串?

事实上,它不能。

让我们仔细看看这个说法:

return fgets(input, sizeof(input), stdin) != NULL;

fgets()返回指向char的指针。检查此指针是否存在空指针。这个布尔表达式的验证要么计算1返回的指针是否为非空指针(fgets()实际上返回了指向input的指针(,要么0如果它是空指针 - 表示使用fgets()消耗输入时发生错误。

这个int值(01(然后从函数getInput()返回;不是指针,甚至不是值本身的字符串(这对于C语法是不可能的(。


旁注:

  1. input似乎是一个全局char阵列。避免使用全局数组。它可能会使您和读者感到困惑。通过引用传递指向缓冲区的指针,并改为按值传递缓冲区的大小。

    static char* getInput (char* buf, size_t len)
    {
    if ( len > INT_MAX || len < 2 )
    {
    return NULL;
    }
    printf("Enter your name: ");
    return fgets(buf, len, stdin);
    }
    

    并像这样称呼它:

    char a[20];
    if ( getInput(a, sizeof(a)) == NULL )
    {
    fputs("Error occured at consuming input!", stderr);
    }
    
  2. 有关此示例中staticqualifer 的含义,请查看:

    什么是 C 中的"静态"函数?

fgets(...) != NULL

这计算为布尔值,布尔值表示为 C 中的整数。

你的函数要么返回true == 1,要么返回false == 0
这不应该返回字符串

实际上OPs函数不返回指针char *但可以这样做

int foo(char *c)
{
return (int)c;
}

它将返回转换为 int 的 char 指针。如果 int 足够大以容纳指针,则可以将其转换回指针。

https://godbolt.org/z/z_xsc7

这种转换在微控制器和非常低级硬件相关的编程中非常普遍(当可移植性无关紧要时(。使用无符号整数(通常是固定大小,如uint64_t以确保它们足够大(来获取、传递和存储地址

相关内容

  • 没有找到相关文章

最新更新