为什么一个int return类型的函数可以return一个字符串?
Why can an int return type function return a string?
这就是我要说的功能:
static int getInput()
{
printf("Enter your name: ");
return fgets(input, sizeof(input), stdin) != NULL;
}
这是如何工作的?为什么一个int return 类型可以这样使用fgets?
fgets(...) != NULL
计算结果为布尔值,布尔值在 C 中表示为整数。
您的函数将 return true == 1
或 false == 0
这不应该return一个字符串
实际上 OPs 函数没有 return char *
指针但是可以这样做
int foo(char *c)
{
return (int)c;
}
它将return char指针转换为int。如果 int 足够大以容纳指针,则可以将其转换回指针。
这种转换在微控制器和非常底层的硬件相关编程中非常常见(当可移植性无关紧要时)。使用无符号整数(通常固定大小,如 uint64_t
以确保它们足够大)来获取、传递和存储地址
"Why can an int
return type function return a string?"
事实上,它不能。
让我们仔细看看这个声明:
return fgets(input, sizeof(input), stdin) != NULL;
fgets()
returns 指向 char
的指针。检查此指针是否为空指针。如果返回的指针是非空指针(fgets()
实际上返回指向 input
的指针),则此布尔表达式的验证结果为 1
,如果是 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
限定符的含义,看一下:
What is a "static" function in C?
这就是我要说的功能:
static int getInput()
{
printf("Enter your name: ");
return fgets(input, sizeof(input), stdin) != NULL;
}
这是如何工作的?为什么一个int return 类型可以这样使用fgets?
fgets(...) != NULL
计算结果为布尔值,布尔值在 C 中表示为整数。
您的函数将 return true == 1
或 false == 0
这不应该return一个字符串
实际上 OPs 函数没有 return char *
指针但是可以这样做
int foo(char *c)
{
return (int)c;
}
它将return char指针转换为int。如果 int 足够大以容纳指针,则可以将其转换回指针。
这种转换在微控制器和非常底层的硬件相关编程中非常常见(当可移植性无关紧要时)。使用无符号整数(通常固定大小,如 uint64_t
以确保它们足够大)来获取、传递和存储地址
"Why can an
int
return type function return a string?"
事实上,它不能。
让我们仔细看看这个声明:
return fgets(input, sizeof(input), stdin) != NULL;
fgets()
returns 指向 char
的指针。检查此指针是否为空指针。如果返回的指针是非空指针(fgets()
实际上返回指向 input
的指针),则此布尔表达式的验证结果为 1
,如果是 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
限定符的含义,看一下:What is a "static" function in C?