这就是我要说的函数:
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
值(0
或1
(然后从函数getInput()
返回;不是指针,甚至不是值本身的字符串(这对于C语法是不可能的(。
旁注:
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); }
有关此示例中
static
qualifer 的含义,请查看:什么是 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
以确保它们足够大(来获取、传递和存储地址