1

テキストファイルから16進数で読み込もうとしていますが、現在これが私が持っているものです

     void hexReader(char* file, node* head){
        FILE *fp;
        char str[MAXCHAR];

        size_t number = 0;

         fp = fopen(file, "r");
         if (fp == NULL){
         printf("Could not open file %s",filename);
        //return 1;
                                          }
           while (fgets(str, MAXCHAR, fp) != NULL) {
         //while ((number = getline(&line, &len, fp)) != -1)
             number = strtoull(str, NULL, 16);
             if (number > 0){
             printf("%size_t \n",number);
             printf("%x \n",number);

         }
       }
       fclose(fp);

  }

数値に unsigned long long を使用しようとしましたが、FFFFFFFFFFFFFFFF のような 16 進数では失敗します。そのようなものを 0x....最大 64 ビットの 16 進数の形式で読み取ることができるはずです。

なぜこれが失敗するのですか?Size_t はナンセンスを出力し、unsinged long long は数値が大きすぎると失敗します。

4

2 に答える 2

1

内部ループの小さな書き直し。

1 必要ありませんsize_t
2errnoの成功を確認するために使用しstrtull()ます。
3 正しいunsigned long long指定子修飾子を使用してください"ll"。仮定する手段が文字列であるため、
4printf("%size_t \n",number)は失敗しました。 5は、 で動作するよりも大きいため、の一部のみを使用していたため、失敗しました。 %snumber
printf("%x \n",number)sizeof(number)sizeof(unsigned)%xnumber

while (fgets(str, MAXCHAR, fp) != NULL) {
  errno = 0;
  char *endptr;
  unsigned long long X = strtoull(str, &endptr, 16);
  // Use these tests as desired to catch overflow, no convert, unexpected extra.
  if (errno || (endptr == str) || (*endptr != '\n')) {
    printf("Error\n");
  }
  else {
    printf("%llx\n", X);  // print hex
    printf("%#llx\n", X);  // print hex with leading 0x
    printf("%#llu\n", X);  // print decimal
  }
}
于 2013-10-09T17:21:38.303 に答える
1

%size_tナンセンスです - %zx16 進size_t値を出力するために使用します。C99 を認識しないコンパイラ/ライブラリを使用しているため%xに修飾子がない場合は、変数の型とフォーマット文字列が一致していることを確認してください。z

printf("%llx\n", (unsigned long long)number);
于 2013-10-09T17:22:37.353 に答える