這是一個整數陣列:檢查或者其一個char或整數
int values[] = { 75, '*', 5,'-' };
for(i=0 ; i<size ; i++){
// Here
}
如何檢查values[i]
是整數或操作??
也許該值等於操作的Ascii值,在這種情況下如何處理?
這是一個整數陣列:檢查或者其一個char或整數
int values[] = { 75, '*', 5,'-' };
for(i=0 ; i<size ; i++){
// Here
}
如何檢查values[i]
是整數或操作??
也許該值等於操作的Ascii值,在這種情況下如何處理?
這是一條危險的道路。在您的例子中,數組將轉換(編譯時)到:
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:作弊的答案是使用動態類型的語言。您的工作量較少,但速度較慢,而且我不知道它是否適合您。
你不能。至於編譯器而言,常量42
和'*'
是一樣的。在編譯目標代碼中,它們都表示爲整數42.
如果您需要區分整數和字符,請使用布爾標誌或枚舉指示值的類型,或者保留整數和字符在單獨的數組中。
注意,在C++,但用C不,有輕微的差別:42
有型int
,而'*'
有型char
,這樣你就可以區分使用重載函數或模板這一事實。
我不能!!你的意思是沒有辦法避開它?在C – 2011-03-01 21:26:24
@Rami:解決它的方法是重新設計你的代碼。不要使用'int'數組,使用包含所需信息的更復雜的結構。 – 2011-03-01 21:33:37
你的數組元素不能是簡單的整數。 試試這個:
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;
}
}
「 - 」是操作和45爲整數,同時 – Andrey 2011-03-01 21:21:57
不錯,但我怎麼能知道它的45或「 - 」? – 2011-03-01 21:22:49
你不能。如果同時具有'-''和'45',''的ascii值將存儲在數組中。所以,有兩個'45',你不能區分這兩者。此外,問題中還有一個錯字。 'values'應該是一個數組。 – Mahesh 2011-03-01 21:27:20