このようなfgets
機能の外観の宣言:fgets()を使用してint型の2番目の引数をキャストしないようにするにはどうすればよいですか?
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 */
Iここで結構ですが、私はfgets
に渡します場合ためのOKでないタイプsize_t
のすでに宣言された長さ:
conversion to ‘int’ from ‘size_t {aka long unsigned int}’ may alter its value
とint
にキャストすると、のサイズがlength
のサイズより小さくなり、一部の情報が失われるため、適合しません。
任意の方法は、どのように私はこのような状況を避ける必要があります...ここに何か欠けていますか?
で議論されているような病的な例を使用して、コーナーケースを考えます; '正しく動作するのでしょうか?とにかくgccとスタックしています。 –
@SouravGhoshここではmallocを使うことができましたが、それについての質問はありません – Michi
多分http://stackoverflow.com/questions/8317295/convert-unsigned-int-to-signed-int -cはあなたに役立ちます。 – Sergio