2014-01-10 66 views
0

我想寫宏觀IS_ALPHABETIC,給出了一個非零值,如果一個字符是字母字符的宏。在這裏面我指的是我定義的IS_LOWER_CASE宏和uppercase宏我之前定義的。寫來檢查,如果一個字符是字母

以下是我有:

#include <stdio.h> 

#define uppercase(n) ((n) <= 'Z' && (n) >= ('A')) 
#define IS_LOWER_CASE(n) (((n) >= 'a') && ((n) <= 'z')) 

#define IS_ALPHABETIC(n) (uppercase(n) || IS_LOWER_CASE(n) ? (n) : 5) 

int main() 
{ 
    char letter = "4"; 
    printf("%d\n", IS_ALPHABETIC(letter)); 
} 

所以基本上IS_ALPHABETIC宏應該給值5,如果該參數是一個字母,因爲它會檢查它是否是一個大寫或小寫字母,但是無論參數如何,它每次給出5次。

例如,在我的情況,我進入4所以它不應該給的值5.應該只有當我輸入的字母值。

uppercaseIS_LOWER_CASE宏只是分別檢查參數是大寫還是小寫。

我不是100%肯定,如果我構建了我的IS_ALPHABETIC正確宏。哪裏不對?

我試圖做嚴格使用這些特定的宏。

+4

那麼標準['isalpha'](http://en.cppreference.com/w/c/string/byte/isalpha)怎麼了? –

+1

isalpha可通過包含ctype.h – Riskhan

+0

我將對我的文章進行編輯。我正在努力嚴格使用這些特定的宏。不過謝謝。 –

回答

10

變化:

char letter= "4"; 

到:

char letter= '4'; 

而且開啓編譯器警告(如gcc -Wall ...) - 讓編譯器捕捉愚蠢的錯誤這樣對你自己節省了很多時間和精力。

請注意,你可能要IS_ALPHABETIC返回TRUE/FALSE(1/0),而不是n或5

而上的編程風格的問題,儘量與命名更加一致,格式,使用括號等,例如這裏是你的代碼的清理版本:

#include <stdio.h> 

#define IS_UPPER_CASE(n) ((n) >= 'A' && (n) <= 'Z') 
#define IS_LOWER_CASE(n) ((n) >= 'a' && (n) <= 'z') 

#define IS_ALPHABETIC(n) (IS_UPPER_CASE(n) || IS_LOWER_CASE(n)) 

int main() 
{ 
    char letter = '4'; 
    printf("%d\n", IS_ALPHABETIC(letter)); 
    return 0; 
} 
+0

謝謝。但它仍然會返回5.有任何建議嗎? –

+2

@XiJiaopin你重新編譯了嗎?用'char letter ='A'',它爲我返回'65',而不是5 –

+0

謝謝。似乎現在已經解決了。 –

0
#include <stdio.h> 

#define IS_UPPER_CASE(n) (((n) <= 'Z') && ((n) >= 'A')) 
#define IS_LOWER_CASE(n) (((n) >= 'a') && ((n) <= 'z')) 

#define IS_ALPHABETIC(n) (IS_UPPER_CASE(n) || IS_LOWER_CASE(n) ? (n) : 5) 

int main() 
{ 
    char letter = 'a'; 
    printf("%d\n", IS_ALPHABETIC(letter)); 
} 

以上是您的代碼段的修改版本,它不會返回5周所有的時間。

char letter =「4」;

上面的初始化生成編譯器警告,因爲您試圖用地址(字符串「4」而不是字符4)初始化字符。

但是,對於您的輸入,如果它是字母表,可能需要打印該字符。但是要打印的是等於該字符的ASCII值的整數值。 因此,您可以在printf()調用中嘗試%c而不是%d。

相關問題