2010-03-25 46 views
5

chuỗi tạm thời bằng "ZERO: \ t.WORD \ t1" từ trình gỡ lỗi của tôi. (Dòng đầu tiên của tập tin của tôi)isalpha (<mychar>) == đánh giá đúng sai?

string temp = RemoveWhiteSpace(data); 
int i = 0; 
if (temp.length() > 0 && isalpha(temp[0])) 
    cout << "without true worked" << endl; 
if (temp.length() > 0 && isalpha(temp[0]) == true) 
    cout << "with true worked" << endl; 

Đây là mã của tôi để kiểm tra xem ký tự đầu tiên của temp là một a-z, A-Z. Câu lệnh if đầu tiên sẽ đánh giá là true và câu lệnh thứ 2 là false. TẠI SAO?!?!?! Tôi đã thử điều này ngay cả khi không có "temp.length()> 0 & &" và nó vẫn đánh giá sai. Nó chỉ ghét "== true". Điều duy nhất tôi có thể nghĩ đến là isalpha() trả về! = 0 và true == 1. Sau đó, bạn có thể nhận được isalpha() == 2! = 1. Nhưng, tôi không biết nếu C++ là ... kỳ dị.

BTW, tôi không cần biết rằng "== true" là vô nghĩa về mặt logic. Tôi biết.

đầu ra là

without true worked 

Biên soạn với CodeBlock sử dụng GNU GCC trên Ubuntu 9.10 (nếu điều này vấn đề có)

+1

Các bạn đã thử 'cout << isalpha (temp [0]) << endl; '? –

+0

"Tôi không biết nếu C++ là ... lạ". Tư vấn một hướng dẫn tham khảo sẽ cung cấp cho bạn một ý tưởng. cplusplus.com nói, "Một giá trị khác 0 (nghĩa là' true') nếu thực sự * c * là một chữ cái ". Đó là lý do tại sao bạn không nên sử dụng cplusplus.com: 'true' trong C++ không có nghĩa là" true "trong mô tả trong tiêu chuẩn C mà chúng đã sao chép từ đó. opengroup.org nói, "Hàm isalpha() sẽ trả về khác 0 nếu c là ký tự chữ cái", cái này khá hơn. –

+0

Ngoài ra, hãy nhớ sự nhầm lẫn giữa hàm isalpha này từ ' 'hoặc' ' và mẫu hàm 'std :: isalpha' trong' '. Cái sau trả về 'bool', vì vậy nếu bạn gọi nó thì mã của bạn sẽ hoạt động. –

Trả lời

9

Hàm * chỉ được đảm bảo trả về giá trị khác 0 nếu đúng, KHÔNG nhất thiết là 1. Một cách thực hiện điển hình là dựa trên bảng, với một mục trong bảng cho mỗi giá trị ký tự và một tập hợp các bit xác định có nghĩa là gì. Là * chức năng sẽ chỉ VÀ bitmask đúng với giá trị bảng, và trở về đó, mà sẽ chỉ có giá trị 1 cho bất cứ loại tình cờ đã được trao vị trí bit 0.

Ví dụ:

#define __digit 1 
#define __lower 2 
#define __upper 4 
extern int __type_table[]; 

int isdigit(int c) { 
    return __type_table[c+1] & __digit; 
} 

int isalpha(int c) { 
    return __type_table[c+1] & (__lower | __upper); 
} 

int islower(int c) { 
    return __type_table[c+1] & __lower; 
} 

int isupper(int c) { 
    return __type_table[c+1] & __upper; 
} 

Trường hợp __type_table được định nghĩa là một cái gì đó như int __type_table[UINT_MAX+1]; và sẽ được khởi tạo như vậy (ví dụ) __type_table['0'+1] == __digit__type_table['A'+1] == __upper.

Trong trường hợp bạn quan tâm, phần '+1' là để lại một vị trí ở đầu bảng cho EOF (thường được định nghĩa là -1).

+0

VÀ NGƯỜI DÂN TỆ TẠI SAO TÔI THÍCH C# ...../NERDRAGE Cảm ơn :) – Buttink

+0

@Buttink: bây giờ bạn đề cập đến nó, có vẻ như lẻ ... :-) –

+7

@Buttink: thích C# là điều khiến bạn gặp rắc rối này - nếu không phải vì C# bạn sẽ vui khi chỉ sử dụng một số nguyên trong điều kiện, thay vì so sánh nó với một giá trị "chân lý" duy nhất, không phải vì các hàm C không được thiết kế để bạn làm điều đó. Sẽ tốt hơn nếu bạn thích C#, nhưng bạn không nên viết C# khi bạn đang viết C++ ;-) –

2

isalpha không trả lại true, nó sẽ trả khác không. Điều này khá phổ biến cho các API được thiết kế cho C.

Lưu ý rằng trong biểu thức isalpha(ch) == true, các subexpression true được thăng gõ int với giá trị 1.

0

Vâng, các tài liệu cho thấy rằng nó sẽ trả về một trong hai số không hay không không, không nhất thiết chỉ là sai hoặc đúng. Vì vậy, bạn nên kiểm tra (isalpha (temp [0])! = 0).

+0

Hoặc '!! isalpha (temp [0])'. –

+3

@mmyers: Hoặc 'isalpha (temp [0])'! – UncleBens

+1

@UncleBens: * Hush, bạn sẽ giết không khí ưu việt của tôi. * –

0

Đừng isalpha(ch) == true, nhưng !!isalpha(ch) == true

+3

Nếu bạn định so sánh giá trị Boolean với giá trị thực (do đó tạo ra giá trị Boolean khác) bạn có chắc chắn rằng một lần là đủ? Có lẽ nó thực sự nên là '(!! isalpha (ch) == true) == true', hoặc thậm chí là' (((((!! isalpha (ch) == true) == true) == true) = = true) == true'? Nhìn này, tôi đã phát minh ra Lisp! :-) –

+3

Bất kỳ biểu thức nào với đôi! dấu hiệu cần phải chết. Nó không phải là ý thức, nó xấu xí, và nó gần như chắc chắn không phải những gì bạn muốn làm anyway. -1. –

+0

@Jerry: Tôi nghĩ rằng những người sành thực sự của các biểu thức boolean bắt đầu bằng '(!! isalpha (ch) == (!! true == !! true))', và lấy nó từ đó khi tâm trạng tấn công. –

Các vấn đề liên quan