【发布时间】:2016-07-18 10:39:45
【问题描述】:
fgets 函数的声明如下所示:
char *fgets(char *str, int n, FILE *stream);
这意味着第二个参数应该是int。
在以下程序中避免这种转换的正确方法是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *buffer = "Michi";
size_t len = strlen(buffer) + 1;
char arr[len];
printf("Type your Input:> ");
if (fgets(arr, (int)len, stdin) == NULL) {
printf("Error, fgets\n");
exit(1);
} else {
printf("Arr = %s\n", arr);
}
}
这里我使用了(int)len,看起来不错,但是如果buffer 存储了一个很长的字符串会怎样?
让我们说:
const char *buffer = "Very long long ..."; /* where length is beyond the range of the `int` type */
我已经声明了 size_t 类型的长度,这在这里很好,但是如果我将它传递给 fgets 是不行的,因为:
conversion to ‘int’ from ‘size_t {aka long unsigned int}’ may alter its value
如果我将其转换为int 将不适合,因为int 的大小小于length 的大小,并且会丢失一些信息。
也许我在这里遗漏了一些东西......
我应该如何避免这种情况?
【问题讨论】:
-
只是说,在这种情况下,您确定
char arr[len];会正常工作吗?无论如何,它与 gcc 堆栈.. -
@SouravGhosh 我可以在这里使用 malloc,但问题不在于那个
-
@Serhio 是否也包括
long unsigned int? -
@Michi 我想是的。 ...对于超出范围的值在有符号/无符号之间进行转换是实现定义的...唯一的标准是超出目标类型的范围,无论
long或short修饰符如何。