Nhờ giải thích lỗi khó hiểu C++

Thấy có bạn đăng bài “Làm đẹp tên”, nhân tiện đang ôn chuẩn bị thi tốt nghiệp, mình làm thử. Và không hiêu sao 2 code này chỉ khác nhau ở dòng thứ 21 mà lại chạy ra kết quả khác nhau:

Temp = "" + Input[0];
//Ran Hoan
Temp = "";
Temp += Input[0];
//Tran Hoan

Đây là code của em, coi như không biết gì C++ viết nên có thể nhìn hơi rối mắt, mong có cao nhân nào giúp đỡ ~~
http://ideone.com/yjz03X (Ran Hoan) và https://ideone.com/vMXChl (Tran Hoan)

Debug để biết code làm gì.

C++ dí F11 hơn 5 phút nó vẫn chạy đi chạy lại ở cái file này, mà nhỡ vô tình dí quá tay…

Chuyển sang C# debug dễ hơn thì 2 code đó đều chạy đúng :expressionless:

Hi Trần Hoàn.
Đặt breakpoint rồi F5 @_@!

1 Like

Thì vẫn thế, mình không hiểu tại sao Temp = "" + Input[0]; hay Temp = (std::string)("" + Input[0]); thì vẫn là Temp == "" trong khi Input == "TrAN HoaN"

http://www.cplusplus.com/reference/string/string/operator+/
http://www.cplusplus.com/reference/string/string/operator+=/
thử xem sự khác nhau giữa 2 toán tử xem có j ko :grin:

1 Like

Okay. A += B không có nghĩa là A = A + B
Hay lắm C++ :slight_smile:
Hay!

http://www.cplusplus.com/doc/tutorial/operators/

Sao đây ghi giống mà bác.

1 Like

A += B tương đương A = A + B khi A là lớp string.

Trường hợp trên thì
"" + Index[0] = const char * + &char -> Không tương đương.

3 Likes

Lỗi này không phải do operator+= hay operator+ của string.
""const char * khi cộng vào Input[0] thì nó trỏ đến địa chỉ khác sau đó mới chuyển về string, cái này là undefined behavior, không cộng được mảng kí tự với số để nối chuỗi.

Temp=""; Temp+=Input[0];
Cái này có sự khác biệt, Tempstring ở dòng sau thì phép cộng là hoàn toàn đúng. Do đó thuật toán khi dùng phép này không bị lỗi

4 Likes

Ồ, thì ra " "const char* chứ không phải là string như mình vẫn tưởng, code lỗi là do mình hiểu sai.
Mình vừa thử ép kiểu Temp = (std::string)"" + Input[0]; thì code chạy đúng, cảm ơn các thím :slight_smile:
Mà mọi người cho mình hỏi luôn, tại sao lại là const char* mà không phải là char* hay char[]. Mình vốn từ C# nhảy ngược về nên không hình dùng được sự khác nhau này.

Đây bác :slight_smile:

2 Likes

" " gọi là string literal. Chuẩn C/C++ quy định nó là const char* vì trong asm mấy string literal nằm trong vùng read-only.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?