C fgets在另一个函数中,sizeof始终为8

C fgets在另一个函数中,sizeof始终为8,c,arrays,char,C,Arrays,Char,我在另一个函数中使用fgets返回有效数据,因为我有一个菜单列表,为每个函数写出fgets会变得重复。我通过一个字符数组result[],它似乎总是8的大小,这导致我的数据被剪裁 void get_input(char result[]) { if(fgets(result, sizeof(result), stdin) == NULL) { // sizeof is ALWAYS 8! read_rest_of_line(); printf("\n");

我在另一个函数中使用
fgets
返回有效数据,因为我有一个菜单列表,为每个函数写出
fgets
会变得重复。我通过一个字符数组
result[]
,它似乎总是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] = '\0';
}
执行中:

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
给出的是指针的大小,而不是数组的大小


要解决此问题,可以显式传递数组的大小。

当数组作为函数参数传递时,它会衰减为指向其第一个元素的指针

在您的示例中,函数参数中的
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] = '\0';
} // 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);

下面是传递长度的一个简单示例 当前输入缓冲区的 使用该长度:

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] = '\0';
} // 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);

这是解决这个问题的唯一方法,还是有一个不涉及更高级的解决方法,例如结构或其他东西?@JohnnyDoey取决于您使用
struct
的意思。我认为显式传递大小通常是一个简单的解决方案。事实上,作为参数声明(并且仅作为参数声明),
char result[]
实际上意味着
char*result
。建议阅读:第6节。这是唯一的解决方案,还是有一个不涉及更高级的解决方案,例如结构或其他东西?@JohnnyDoey取决于您使用
struct
的意思。我认为显式传递大小通常是一个简单的解决方案。事实上,作为参数声明(并且仅作为参数声明),
char result[]
实际上意味着
char*result
。建议阅读:第6节。你的意思是
fgets(…)!=空值
?您可能正在处理所有可能的fgets情况。将函数更改为
void get_input(char result[],size\u t size)void get_valid_input(char result[],size\u t size)
您的意思是
fgets(…)!=空值
?您似乎正在处理所有可能的fgets情况。将函数更改为
void get\u input(char result[],size\u t size)void get\u valid\u input(char result[],size\u t size)