Chủ đề: chuỗi trong c
-
15-07-2016, 10:48 AM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
chuỗi trong c
mọi người giải thích hộ mình sao chuỗi khai báo 5 kí tự mà nhập 6 kí tự vẫn bình thường thế nhỉView more random threads:
- giúp mình tìm lỗi sai với
- Số lần xuất hiện của phần tử trong dãy số
- dich bit va and bit
- Hoàn thiện lớp nhân viên giúp mình
- [Bài tập]Lập trình hướng đối tượng trong C++
- Cho mình hỏi về RichEditControl của DXperience 12.1
- Làm việc với Dev Cpp
- Lỗi của bài tập về phân số
- Mọi người giúp mình bài tập C++
- Nhập dữ liệu từ file vào bị sai số không đáng có
-
16-07-2016, 08:50 AM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
thế vậy chuỗi mình nhập vào sẽ được lưu như thế nào trong khi chuỗi khai báo không đủ để lưu
-
16-07-2016, 09:12 AM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Nhớ lõm bõm trong c/c++, null terminated string
str[last] = '\0';
-
16-07-2016, 06:21 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi LQR_LQRGửi bởi MHoang
① Như bạn MHoang nói Hàm gets được cảnh báo không an toàn, không nên dùng ,
mình đã thử dùng với scanf() thì bị lỗi corupted khi nhập chuỗi(abcde, abcdef,...) >= 5 , khi khai báo chuoi[5] thì chỉ nhập được chuỗi có số ký tự < 5
⇒ vì chuoi[5] = 4 ký tự + ký tự kết thúc chuỗi '\0'
Như vậy, khi nhập chuỗi trong C thì:
- nên dùng cách mà bạn LQR_LQR đã nói là tốt nhất rồi phải ko nhỉ?
fgets( chuoi, NumberOfString ,stdin);
② Vậy khi muốn nhập từng phần tử cho mảng chuoi[5] thì nếu dùng vòng lặp for() , chỉ nên cho chạy từ 0 -> 4 thôi phải ko?
for (i=0; i<4; i++) {
Mã:#include <stdio.h>#include <conio.h> int main(){ char chuoi[5]; int i; printf("nhap chuoi: "); //for (i=0; i<5; i++) { for (i=0; i<4; i++) { gets(&chuoi[i]); //scanf("%s", &chuoi[i]); } printf("chuoi vua nhap: %s", chuoi); getch(); return 0;}
Mã:#include <stdio.h>#include <conio.h> int main(){ char chuoi[5]; printf("nhap chuoi: "); //fgets( chuoi, 5 ,stdin ); scanf("%s", &chuoi); // ⇒ nhập chuỗi cho mảng chuoi[5] scanf("%s", chuoi); // ⇒ nhập chuỗi cho con trỏ chuoi, lúc này con trỏ chuỗi đang trỏ vào địa chỉ đầu tiên của mảng chuoi[5] printf("chuoi vua nhap: %s", chuoi); getch(); return 0;}
Có gì sai sót chỉ giúp mình nhé.
-
16-07-2016, 06:54 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
LQR_LQR : Chắc chắn là vẫn bình thường rồi
kemao97 : chuỗi mình nhập vào sẽ được lưu như thế nào trong khi chuỗi khai báo không đủ để lưu
Hàm gets được cảnh báo không an toàn, không nên dùng, có nhiều bẫy việt vị ở đây. Chúng ta cùng xem thử 1 đoạn mã
Mã:#include <stdio.h>int main(){ char chuoi[2][5] = { "????","TRUE" }; printf("Nhap chuoi 1: "); gets(chuoi[0]); printf(" Chuoi vua nhap 1: %s", chuoi[0]); printf(" Chuoi 2 hien tai: %s", chuoi[1]); return 0;}
_ Chạy chương trình và nhập vào : abcde => Chương trình in ra : "abcde" và một chuỗi <null>. (2)
_ Chạy chương trình và nhập vào : abcdef => Chương trình in ra : "abcdef" và chuỗi "f". (3)
_ Chạy chương trình và nhập vào : abcdeFALSE => Chương trình in ra : "abcdeFALSE" và "FALSE". (4)
Trong (2), (3), (4) Chuỗi 2 đã bị ghi đè dù chúng ta chẳng hề truy xuất ghi lên nó.
Như bạn thấy, hàm gets điền tất cả dữ liệu nhập vào địa chỉ bắt đầu của chuỗi bất kể số lượng và sau đó nó thêm vào 1 ký tự null. Nó sẽ ghi vượt ra ngoài biên của buffer và nếu phần ở ngoài đó thuộc về một biến khác (xấu hơn là của chương trình khác) thì điều này có thể gây ra một lỗi trầm trọng -> Dừng chương trình đột ngột (có thể còn nặng hơn).
-
16-07-2016, 07:02 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Chắc chắn là vẫn bình thường rồi, vì hàm gets của bạn không kiểm tra số ký tự đầu vào. Bạn thử dùng fgets( chuoi, NumberOfString ,stdin);
-
16-07-2016, 07:43 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Tham khảo :
http://stackoverflow.com/questions/10186765/char-array-vs-char-pointer-in-c
Vệ sinh cá nhân là một phần quan yếu của sức khỏe nam giới. Dùng dung dịch vệ sinh mỗi ngày mang lại nhiều ích, giúp loại bỏ vi khuẩn và vi sinh vật gây hại, giúp khu vực cơ quan sinh dục luôn sạch...
Gel vệ sinh cu, bạn trai có nên...