2010-01-24 30 views
1

我試圖寫一個函數來檢測分隔字符由分配定義的,我知道這是不好的編程風格鑄字,整數和C++

#define EXCLAMATION_POINT 33, but to instead do #define EXCLAMATION_POINT '!' 

這是我的代碼:

#include <iostream> 
#include <ostream> 
using namespace std; 
#define PERIOD '.' 
#define QUESTION_MARK '?' 
#define EXCLAMATION_POINT '!' 
#define COMMA ',' 
#define COLON ':' 
#define SEMICOLON ';' 

inline bool IsSeparator(int x) 
{ 
    if (isspace(x) || 
     x == PERIOD || 
     x == QUESTION_MARK || 
     x == EXCLAMATION_POINT || 
     x == COMMA || 
     x == COLON || 
     x == SEMICOLON) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

int main (int argc, char * const argv[]) { 
    int input; 
    cout << "Enter characters: \n"; 
    input = cin.get(); 
    if (!IsSeparator(input)) 
     cout << "true"; 
    else { 
     cout << "false"; 
    } 
    return 0; 
} 

但是在我的IsSeparator()中,如何將int轉換爲與'!'進行比較的字符。我想如果我做了像(char)EXCLAMATION_POINT這樣的工作,但它不會,值是留在一個int。我在這裏做錯了什麼?謝謝!

+0

呃,不知道我是否完全明白你對'#define'和style的看法,但是* best *方法根本就沒有這樣做。只需用''.''替換'PERIOD',等等。如果你真的需要常量,至少要使它們成爲'static const char Period ='。',根本不需要使用'#define',更不用說尖叫了。 :] – GManNickG 2010-01-24 18:48:43

+0

此外,您的代碼爲我工作正常。 – GManNickG 2010-01-24 18:50:51

回答

3

你不需要任何演員,但:

if (!IsSeparator(input)) 

應該是:

if (IsSeparator(input)) 

此外,您提示:

cout << "Enter characters: \n"; 

意味着你可以輸入多個字符。所以你可以,但cin.get()只能讀一個。

關於給符號名稱的東西。假設您正在解析分隔符是冒號的文件。話很有道理地說:

const char SEPARATOR = ':'; 

,因爲你可以再更改它,當文件格式的變化,例如:

const char SEPARATOR = '|'; 

,但它不能正常意義給你自己的名字到ASCII(或其他)字符集的成員。

在你的代碼,它可能是有意義的創造分離的數組(我不會顯示所有你用我的打字方便的的):

const char SEPARATORS[] = {':', '|', '!', 0 }; 

,然後讓你的驗證功能迭代在陣列上。注意在這種情況下,數組也被表示爲一個字符串:

const char * const SEPARATORS = ":|!"; 
2

你有什麼想法,那些#define s爲所有一個好的做法?您是否需要處理2015年偉大的驚歎號重新定義?

假設感嘆號現在和永遠都會由'!'表示,這可能是安全的。就像明天一樣,不變的人也將由1代表。

除了需要定義ONE或MINUS或INT以外,您無需定義EXCLAMATION_MARK。

+0

Unicode可能嗎? ;> – 2010-01-24 19:02:27

+0

@Kornel:據我所知,Unicode將前255個字符與ASCII匹配。所以''!''留下'!''。但我幾乎不知道Unicode。 – GManNickG 2010-01-24 19:10:32

+0

好吧,有兩種可能性:單個字符「!!」是感嘆號,在這種情況下,對「!」進行測試,或者感嘆號由多個字符序列表示 - 但如果情況就是這樣,'#define'也沒有幫助,因爲* char *之間的比較不會起作用。在這種情況下,你必須對比一系列'char's。所以你需要一個'is_exclamation_mark()'函數,而不是比較一個字符和'#define' – jalf 2010-01-24 19:42:02