fgets 在另一个函数中,sizeof 总是 8
fgets within another function, sizeof is always 8
我在另一个函数中使用 fgets
来 return 有效数据,因为我有一个菜单列表,并且为每个函数写出 fgets
变得重复。我通过了一个字符数组 result[]
,它似乎总是 sizeof 8,这导致我的数据被截断。
void get_input(char result[]) {
if(fgets(result, sizeof(result), stdin) == NULL) { // sizeof is ALWAYS 8!
read_rest_of_line();
printf("\n");
} else
clearbuffer(result);
}
void get_valid_input(char result[]) {
get_input(result);
while(result == NULL || result[0] == '\n') {
printf("Enter a valid input or quit with CTRL+D\n");
get_input(result);
}
/* remove newline replace with nul terminator */
result[strlen(result)-1] = '[=10=]';
}
正在执行:
char equipment_id[7];
char equipment_name[31+1];
char equipment_quantity[sizeof(long)];
long quantity;
printf("New ID: ");
get_valid_input(equipment_id);
printf("Please enter the equipment name: ");
get_valid_input(equipment_name);
printf("Please enter the total quantity: ");
get_valid_input(equipment_quantity);
当数组作为函数参数传递时,它会衰减为指向其第一个元素的指针。
在你的例子中,函数参数中的char result[]
实际上是一个指针,因此sizeof
给出了指针的大小,而不是数组。
要解决此问题,您可以显式传递数组的大小。
下面是一个传递长度的简单例子
当前输入缓冲区
并使用该长度:
void get_input(char *result, int maxSize)
{
if(fgets(result, maxSize, stdin) == NULL)
{
read_rest_of_line();
printf("\n");
}
else
{
clearbuffer(result);
}
} // end function: get_input
void get_valid_input(char *result, int maxSize)
{
memset( result, 0x00, maxSize );
get_input(result, maxSize);
while(result[0] == '\n')
{
printf("Enter a valid input or quit with CTRL+D\n");
get_input(result, maxSize);
}
/* remove newline replace with nul terminator */
result[strlen(result)-1] = '[=10=]';
} // end function: get_valid_input
char equipment_id[7];
char equipment_name[31+1];
char equipment_quantity[sizeof(long)];
long quantity;
printf("New ID: ");
get_valid_input(equipment_id, sizeof(equipment_id);
printf("Please enter the equipment name: ");
get_valid_input(equipment_name, sizeof(equipment_name);
printf("Please enter the total quantity: ");
get_valid_input(equipment_quantity, sizeof( equipment_quantity);
我在另一个函数中使用 fgets
来 return 有效数据,因为我有一个菜单列表,并且为每个函数写出 fgets
变得重复。我通过了一个字符数组 result[]
,它似乎总是 sizeof 8,这导致我的数据被截断。
void get_input(char result[]) {
if(fgets(result, sizeof(result), stdin) == NULL) { // sizeof is ALWAYS 8!
read_rest_of_line();
printf("\n");
} else
clearbuffer(result);
}
void get_valid_input(char result[]) {
get_input(result);
while(result == NULL || result[0] == '\n') {
printf("Enter a valid input or quit with CTRL+D\n");
get_input(result);
}
/* remove newline replace with nul terminator */
result[strlen(result)-1] = '[=10=]';
}
正在执行:
char equipment_id[7];
char equipment_name[31+1];
char equipment_quantity[sizeof(long)];
long quantity;
printf("New ID: ");
get_valid_input(equipment_id);
printf("Please enter the equipment name: ");
get_valid_input(equipment_name);
printf("Please enter the total quantity: ");
get_valid_input(equipment_quantity);
当数组作为函数参数传递时,它会衰减为指向其第一个元素的指针。
在你的例子中,函数参数中的char result[]
实际上是一个指针,因此sizeof
给出了指针的大小,而不是数组。
要解决此问题,您可以显式传递数组的大小。
下面是一个传递长度的简单例子 当前输入缓冲区 并使用该长度:
void get_input(char *result, int maxSize)
{
if(fgets(result, maxSize, stdin) == NULL)
{
read_rest_of_line();
printf("\n");
}
else
{
clearbuffer(result);
}
} // end function: get_input
void get_valid_input(char *result, int maxSize)
{
memset( result, 0x00, maxSize );
get_input(result, maxSize);
while(result[0] == '\n')
{
printf("Enter a valid input or quit with CTRL+D\n");
get_input(result, maxSize);
}
/* remove newline replace with nul terminator */
result[strlen(result)-1] = '[=10=]';
} // end function: get_valid_input
char equipment_id[7];
char equipment_name[31+1];
char equipment_quantity[sizeof(long)];
long quantity;
printf("New ID: ");
get_valid_input(equipment_id, sizeof(equipment_id);
printf("Please enter the equipment name: ");
get_valid_input(equipment_name, sizeof(equipment_name);
printf("Please enter the total quantity: ");
get_valid_input(equipment_quantity, sizeof( equipment_quantity);