2012-12-03 10 views
9

Với MSVC 2010 tôi cố gắng biên dịch trong chế độ C hoặc C++ (cần phải được compilable trong cả hai) và nó không hoạt động. Tại sao? Tôi nghĩ và tìm thấy trong tài liệu '\ x' lấy hai ký tự tiếp theo dưới dạng ký tự hex và không nhiều hơn (4 ký tự khi sử dụng \ X ").C Chuỗi Chữ "quá lớn đối với ký tự"

Tôi cũng biết rằng không có cách nào để sử dụng mã ký tự ASCII bên ngoài trong mã nguồn C dù sao, vậy làm thế nào tôi có thể chỉ định một số ký tự ISO-8859-1 Đức?

int main() { 
    char* x = "\xBCd"; // Why is this not char(188) + 'd' 
} 

// returns test.c(2) : error C2022: '3021' : too big for character 
// and a warning with GCC 
+0

'unsigned char' vs' char'? 'char' có nhiều khả năng được ký, trong đó giá trị trường hợp trên 127 là" quá lớn ". – twalberg

+0

Cảm ơn nhưng không. Tôi đã thử nó với unsigned char quá. Thông báo lỗi tương tự. – Lothar

+0

@Lothar: Tôi không có ý là một nazi, nhưng bạn có nghĩa là ANSI C thay vì ASCII C phải không? ;) Ngoài ra, bạn nói đúng rằng không có cách di động thực sự để làm unicode. Bạn sẽ cần chỉ định mã hóa chính mình nếu bạn đang sử dụng bộ ký tự> 8 bit. Kiểm tra bài đăng này: http://stackoverflow.com/questions/1421811/how-do-i-represent-a-unicode-character-in-a-literal-string-iso-ansi-c-when-the-c –

Trả lời

13

Đáng tiếc là bạn đã vấp phải sự thật rằng \x sẽ đọc từng ký tự cuối cùng mà dường như là hex 1,2, thay vào đó bạn sẽ cần phải giải quyết vấn đề này:

const char *x = "\xBC" "d"; /* const added to satisfy literal assignment probs */ 

Xem xét kết quả từ chương trình này:

/* wide.c */ 
#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    const char *x = "\x000000000000021"; 
    return printf("%s\n", x); 
} 

Biên soạn và thực hiện:

C:\temp>cl /nologo wide.c 
wide.c 

C:\temp>wide 
! 
  1. Thử nghiệm trên của Microsoft C++ biên dịch vận chuyển với VS 2K12, 2k10, 2k8 và 2k5
  2. Tested trên gcc 4.3.4.
+1

Công cụ đánh dấu cú pháp Vim của tôi dường như đồng ý với quy tắc này. Nhưng dù sao, 'x' có thể là' char const * '. – bitmask

+1

Một tùy chọn khác là chuyển sang bát phân: '" \ 274d "' được hiểu là chuỗi hai ký tự, như là '" \ 2740 "'. – user4815162342

+0

@bitmask: Tôi tin bạn có nghĩa là 'const char *'. 'char * const' sẽ khai báo một con trỏ const, nhưng đó không phải là những gì cần phải được const ở đây –