2013-01-05 26 views
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"); 
    } 

位數這是它的外觀now.I要求用戶輸入ID和檢查,如果是與isValidId方法有效,但是當我輸入ID我的程序崩潰。請幫忙!由於獲取的整

+6

'log10'對此很有幫助。 – chris

+0

您可以不斷地用10除以手動執行對數...實際上並不像聽起來那麼慢,但如果性能很關鍵,可以進一步優化。 –

+0

如果你想知道,Kerrek可能在談論http://vimeo.com/55639112(約30米)中描述的功能。 – Zeta

回答

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

我覺得這可能是一個很好的解決方案,既易於閱讀又高效。

沒有必要收購它的長度,如果你只是想判斷它是否是一個有效的ID

程序崩潰,因爲isValidId的參數是指向int的指針,不是int,所以

validID = isValidId(c.id); 

應該是所有的

validID = isValidId(&c.id); 
+1

+1:爲什麼打擾計數數字,當你只需要一個簡單的範圍檢查?好一個:)。 – Zeta

+1

實際考慮手頭情況的方法。當然如果你需要實際計算長度,你可以做其他事情,但我們只對這裏的長度感興趣。 – chris

+0

非常感謝!請看我更新的問題。 – user1930901

-1

是這樣的方式更容易:

#include <math.h> 
bool isValidId(int *id) 
{ 
    return (int)log10(*id) == 6; 
} 
+1

'id'爲'int','atoi'從字符串轉換爲'int'。你在這裏幹什麼? 'itoa'可能是你的意思(int to string),但它不是標準C. – nhahtdh

+0

對不起,應該是itoa。弄錯了。他在使用atoi,所以我認爲他必須這樣做。 – George

+0

什麼編譯器有'itoa'這樣的函數簽名?如果你可以給出一個鏈接到一個文檔,上面簽名列出'itoa',我會認爲它是有效的。只能找到這個'char * itoa(int value,char * str,int base);' – nhahtdh

0

我沒有做下億萬但嘗試這樣的事情

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

    return true; 
} 
+1

幾乎,但'sprintf'不返回字符串,所以你必須解決這個問題。 – chris

+0

@chris感謝指出,如我所說已經很多年了,我已更正了代碼 – Neo

1

首先,我看不出有任何理由要一個指針傳遞給isValidId功能。您可以傳遞一個整數並計算位數。

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

現在至少有兩種方法來計算位數。首先是使用log10。 10位整數n中的位數是(int)(log10(n) + 1)。您需要導入math.h才能使用log10。在致電log10之前,您可能會檢查是否爲n <= 0。第二種方法是循環n

int count = 0; 

while (n > 0) { 
    count++; 
    n /= 10; 
} 
1
  1. 您已經聲明isValidId採取的指針int,但你傳遞一個簡單的int;在這種情況下,沒有理由使用指針,所以最好將isValidId更改爲使用常規int

  2. 永遠永遠永遠永遠永遠永遠使用gets - IT WILL INTRODUCE故障/嚴重的安全漏洞點在你的代碼。改爲使用fgets(input, sizeof input, stdin)

  3. input如何聲明?是否足夠容納與int允許的數量一樣多的數字,加上一個符號以及一個0終止符?

  4. log10返回double,而不是int。要使用log10正確計數數字,您需要編寫類似(int)floor(log10(id)) + 1的內容。

您可以簡化isValidId功能一點:

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

布爾數據類型是一個後來者,C語言(C99的引入),所以我們很多的舊型傾向於避免在我們的代碼中使用布爾常量。