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

时间:2020-06-03 11:17:27

标签: c string return return-type boolean-expression

这是我正在谈论的功能:

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

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

4 个答案:

答案 0 :(得分:3)

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

实际上,它不能。

让我们仔细看一下这句话:

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

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

然后从函数int返回此0值(1getInput());本身不是指针,也不是按值本身的字符串(就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. 对于本示例中的static限定词的含义,请看一下:

    What is a "static" function in C?

答案 1 :(得分:1)

fgets(...) != NULL

这是一个布尔值,布尔值用C表示为整数。

答案 2 :(得分:0)

您的函数将返回true == 1false == 0
这不应该返回字符串

答案 3 :(得分:-1)

实际上,OPs函数不会返回char *指针,但是有可能会返回

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

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

https://godbolt.org/z/z_xsc7

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