2
  bool isValidId(int* id)
  {
        if(log10(*id) != 6)
        {
           return false;
        }

   return true;
  }


  printf("Enter ID: ");
  gets(input);
  c.id = atoi(input);
  validID= isValidId(c.id);
  if(!validID)
  {
     printf("Invalid ID format -(Use example 123456 format). \n");
  }

ユーザーに ID を入力して isValidId メソッドで有効かどうかを確認するように依頼しましたが、ID を入力するとプログラムがクラッシュします。助けてください!ありがとう

4

5 に答える 5

9
return *id >= 100000 && *id < 1000000;

これは、読みやすく効率的な良い解決策であると思います。

有効なIDかどうかを判断したいだけなら、長さを取得する必要はありません

isValidId のパラメータが int ではなく int へのポインタであるため、プログラムがクラッシュするため、

validID = isValidId(c.id);

する必要があります

validID = isValidId(&c.id);
于 2013-01-05T12:03:59.460 に答える
1
  1. isValidIdへのポインターを受け取ると宣言しましたが、プレーンな;intを渡しています。intこの場合、ポインターを使用する理由はないのでisValidId、通常の を使用するように変更したほうがよいでしょうint

  2. 絶対に決して絶対にGETSを使用しないでください -それはあなたのコードに障害のポイント/重大なセキュリティホールを導入します。fgets(input, sizeof input, stdin)代わりに 使用してください。

  3. どのようにinput宣言されますか?可能な限り多くの数字int、符号、および 0 ターミネータを保持するのに十分な大きさですか?

  4. log10doubleではなく を返しますint。で桁数を正しく数えるにはlog10、 のように書く必要があります (int)floor(log10(id)) + 1

isValidId関数を少し単純化できます。

bool isValidId(int id)
{
  return (int) floor(log10(id)) + 1 == 6;
}

Boolean データ型は C 言語 (C99 で導入) の後発型であるため、古い型の多くはコードで Boolean 定数を使用することを避ける傾向があります。

于 2013-01-05T14:10:22.673 に答える
1

まず、関数にポインタを渡す理由がわかりませんisValidId。整数を渡して桁数を計算できます。

bool isValidId(int id) {
    // count digits here
}

現在、桁数を計算する方法は少なくとも 2 つあります。最初の 1 つは使用することlog10です。10 進整数 n の桁数は です(int)(log10(n) + 1)math.hを使用するには、インポートする必要がありますlog10n <= 0に電話する前に確認してくださいlog10

2 番目の方法は、 をループすることnです。

int count = 0;

while (n > 0) {
    count++;
    n /= 10;
}
于 2013-01-05T12:04:31.817 に答える
0

私は長い間Cをやったことがありませんが、このようなことを試してください

bool isValidId(int* id)
{
    char str[15];
    sprintf(str, "%d", id)
    if(strlen(str) != 6)
    {
        return false;
    }

    return true;
}
于 2013-01-05T12:01:21.913 に答える
-1

これは次のように簡単です。

#include <math.h>
bool isValidId(int *id)
{
    return (int)log10(*id) == 6;
}
于 2013-01-05T11:57:33.343 に答える