2011-03-01 43 views
0

這是一個整數陣列:檢查或者其一個char或整數

int values[] = { 75, '*', 5,'-' }; 

for(i=0 ; i<size ; i++){ 
    // Here 
} 

如何檢查values[i]是整數或操作??

也許該值等於操作的Ascii值,在這種情況下如何處理?

+0

「 - 」是操作和45爲整數,同時 – Andrey 2011-03-01 21:21:57

+0

不錯,但我怎麼能知道它的45或「 - 」? – 2011-03-01 21:22:49

+3

你不能。如果同時具有'-''和'45',''的ascii值將存儲在數組中。所以,有兩個'45',你不能區分這兩者。此外,問題中還有一個錯字。 'values'應該是一個數組。 – Mahesh 2011-03-01 21:27:20

回答

4

這是一條危險的道路。在您的例子中,數組將轉換(編譯時)到:

int values[] = {75, 42, 5, 45}; 

所以當你看到數字42 ......是什麼呢?是'*'這個字,還是你的意思是42

也不能依賴類型轉換,因爲所有的值都將被轉換爲int s,因爲它們存儲在整數數組中。最好的辦法是使同時擁有類型和價值,像這樣一個結構:

typedef struct 
{ 
    int type; //0 for int, 1 for operator, and so forth. 
    int value; //holds either a character code or an integer value 
    //you could use a union here, if you felt it would make things cleaner... 
} Token; 

然後檢查,看看是什麼類型的token是看着token.type的問題。

希望這會有所幫助!

PS:作弊的答案是使用動態類型的語言。您的工作量較少,但速度較慢,而且我不知道它是否適合您。

8

你不能。至於編譯器而言,常量42'*'是一樣的。在編譯目標代碼中,它們都表示爲整數42.

如果您需要區分整數和字符,請使用布爾標誌或枚舉指示值的類型,或者保留整數和字符在單獨的數組中。

注意,在C++,但用C不,有輕微的差別:42有型int,而'*'有型char,這樣你就可以區分使用重載函數或模板這一事實。

+0

我不能!!你的意思是沒有辦法避開它?在C – 2011-03-01 21:26:24

+4

@Rami:解決它的方法是重新設計你的代碼。不要使用'int'數組,使用包含所需信息的更復雜的結構。 – 2011-03-01 21:33:37

0

你的數組元素不能是簡單的整數。 試試這個:

enum ElementType {INTEGER, OPERATION}; 
struct ArrayElement { 
    enum ElementType etype; 
    int evalue; 
}; 
struct ArrayElement values[] = { 
    {INTEGER, 75}, {OPERATION, '*'}, {INTEGER, 5}, {OPERATION, '-'} 
}; 

for (i = 0; i < sizeof values/sizeof *values; i++) { 
    /* Here */ 
    switch (values[i].etype) { 
     default: printf("unrecognized type. value is %d.\n", values[i].value); 
       break; 
     case INTEGER: printf("INTEGER with value %d.\n", values[i].value); 
         break; 
     case OPERATION: printf("OPERATION with value '%c'.\n", values[i].value); 
         break; 
    } 
} 
相關問題