Trong lập trình c++ , ta sử dụng tương đối nhiều đến xâu kí tự char , thực chất xâu kí tự là một mảng một chiều kiểu char , nhưng trong quá trình sử dụng chúng ta vẫn còn một số sai sót . Vì thế hôm nay tut mình đi sâu vào những sai sót đó mong là hữu ích cho các bạn chưa biết .
Mình kết hợp với một vài nguồn tài liệu...
Những sai sót khi sử dụng mảng kí tự :
1.Chưa cấp phát bộ nhớ mà đã sử dụng xâu :
vd ta khai báo một con trỏ :
char *p; cin.getline(p,60);
Ở đây ta chưa cấp phát bộ nhớ cho p mà đã sử dụng nó . Khi debug vẫn chạy được nhưng xuất hiện lỗi run-time , tóm lại nó thuộc lỗi cấp phát .
2. Thay đổi giá trị của con trỏ hằng .
Con trỏ hằng là con trỏ trỏ đến vùng nhớ cố định , tức là thông qua con trỏ đó ta không thể thay đối giá trị của vùng nhớ đó , nhưng ta vẫn có thể khiến con trỏ đó trỏ đi vị trí khác
VD : ta khai báo :
char *ch = "Chao cac ban"; // hoặc char ch[] = "Chao cac ban".
ch[2] = 'c'; //khi ta viết ch[2] thì trình biên dịch hiểu là *(ch+2), 2 cách viết hoàn toàn giống nhau
Lúc này ch như một con trỏ, trỏ đến hằng xâu là "Chao cac ban" , nhưng ta cố tình thay đổi giá trị của vùng nhớ thông qua con trỏ bằng câu lệnh *(ch+2) = 'c' .
3. Khi học mảng kí tự ta có một chú ý rất quan trọng như sau :
Đại loại là : ta chỉ có thể khởi tạo giá trị cho mảng kí tự khi khai báo mảng kí tự đó :
vd : char ch[] = "Chao cac ban" ; // Đúng
nhưng char ch[60]; ch = "Chao cac ban" ; //Sai
Bản chất của việc này như sau :
Khi ta khai báo char ch[60]; thì bộ nhớ lấy 60 phần tử liên tiếp nhau cấp phát cho con trỏ ch để nó quản lý , ch là một hằng con trỏ tức là nó luôn trỏ vào vị trí đã được cấp phát đó , ngoài ra không thể trỏ đi dâu được nữa . Nhưng lệnh ch = "Chao cac ban"; đã ép nó trỏ đến địa chỉ khác , cụ thể là địa chỉ của hằng xâu "Chao cac ban ", nằm ở đâu đó trong vùng nhớ.
Để sửa lỗi này ta làm như sau :
char ch[60] = "Chao cac ban";
4.Còn một lỗi sai nghiêm trọng khác đó là :
So sánh nội dung 2 con trỏ :
Trước tiên ta đến với bản chất của việc so sánh 2 con trỏ , việc so sánh ngang bằng là việc so sanh xem 2 con trỏ có trỏ cùng vào một vị trí hay không , xem con trỏ có trỏ vào NULL hay không
Còn phép so sánh > , < là so sánh sự cao thấp của 2 địa chỉ , con trỏ lớn hơn thì địa chỉ cao hơn , con trỏ nhỏ hơn thì có địa chỉ thấp hơn .
Xét ví dụ :
char ch[] = "Chao ban";
if (ch=="Chao ban"){........};
Việc so sánh không sai về ngữ pháp nhưng nó mạng lại kết quả không mong muốn , thực chất việc so sánh trên là xem ch , hằng xâu "Chao ban" có trỏ vào cùng một địa chỉ hay không hay ô nhớ của 2 thằng trên có cùng một giá trị (giá trị này là địa chỉ) hay không . Thực tế điều này được lưu ý khi học mảng kí tự chúng ta có hàm strcmp để so sánh 2 xâu.
Mình kết hợp với một vài nguồn tài liệu...
Những sai sót khi sử dụng mảng kí tự :
1.Chưa cấp phát bộ nhớ mà đã sử dụng xâu :
vd ta khai báo một con trỏ :
char *p; cin.getline(p,60);
Ở đây ta chưa cấp phát bộ nhớ cho p mà đã sử dụng nó . Khi debug vẫn chạy được nhưng xuất hiện lỗi run-time , tóm lại nó thuộc lỗi cấp phát .
2. Thay đổi giá trị của con trỏ hằng .
Con trỏ hằng là con trỏ trỏ đến vùng nhớ cố định , tức là thông qua con trỏ đó ta không thể thay đối giá trị của vùng nhớ đó , nhưng ta vẫn có thể khiến con trỏ đó trỏ đi vị trí khác
VD : ta khai báo :
char *ch = "Chao cac ban"; // hoặc char ch[] = "Chao cac ban".
ch[2] = 'c'; //khi ta viết ch[2] thì trình biên dịch hiểu là *(ch+2), 2 cách viết hoàn toàn giống nhau
Lúc này ch như một con trỏ, trỏ đến hằng xâu là "Chao cac ban" , nhưng ta cố tình thay đổi giá trị của vùng nhớ thông qua con trỏ bằng câu lệnh *(ch+2) = 'c' .
3. Khi học mảng kí tự ta có một chú ý rất quan trọng như sau :
Đại loại là : ta chỉ có thể khởi tạo giá trị cho mảng kí tự khi khai báo mảng kí tự đó :
vd : char ch[] = "Chao cac ban" ; // Đúng
nhưng char ch[60]; ch = "Chao cac ban" ; //Sai
Bản chất của việc này như sau :
Khi ta khai báo char ch[60]; thì bộ nhớ lấy 60 phần tử liên tiếp nhau cấp phát cho con trỏ ch để nó quản lý , ch là một hằng con trỏ tức là nó luôn trỏ vào vị trí đã được cấp phát đó , ngoài ra không thể trỏ đi dâu được nữa . Nhưng lệnh ch = "Chao cac ban"; đã ép nó trỏ đến địa chỉ khác , cụ thể là địa chỉ của hằng xâu "Chao cac ban ", nằm ở đâu đó trong vùng nhớ.
Để sửa lỗi này ta làm như sau :
char ch[60] = "Chao cac ban";
4.Còn một lỗi sai nghiêm trọng khác đó là :
So sánh nội dung 2 con trỏ :
Trước tiên ta đến với bản chất của việc so sánh 2 con trỏ , việc so sánh ngang bằng là việc so sanh xem 2 con trỏ có trỏ cùng vào một vị trí hay không , xem con trỏ có trỏ vào NULL hay không
Còn phép so sánh > , < là so sánh sự cao thấp của 2 địa chỉ , con trỏ lớn hơn thì địa chỉ cao hơn , con trỏ nhỏ hơn thì có địa chỉ thấp hơn .
Xét ví dụ :
char ch[] = "Chao ban";
if (ch=="Chao ban"){........};
Việc so sánh không sai về ngữ pháp nhưng nó mạng lại kết quả không mong muốn , thực chất việc so sánh trên là xem ch , hằng xâu "Chao ban" có trỏ vào cùng một địa chỉ hay không hay ô nhớ của 2 thằng trên có cùng một giá trị (giá trị này là địa chỉ) hay không . Thực tế điều này được lưu ý khi học mảng kí tự chúng ta có hàm strcmp để so sánh 2 xâu.
Không có nhận xét nào:
Đăng nhận xét