Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7

Chủ đề: chuỗi trong c

  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    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

  3. #3
    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';

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi LQR_LQR
    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);
    Trích dẫn Gửi bởi MHoang
    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 : abcd => Chương trình in ra : "abcd" và "TRUE". (1)
    _ 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).
    Mình mới làm quen với C nên qua bài này mình có 3 thắc mắc như bên dưới, các bạn chỉ giúp nhé:

    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);
    - hay là nên dùng hàm nhập chuỗi nào các bạn ?

    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;}
    Thắc mắc về scanf() khi nhập chuỗi :

    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;}
    Đối với nhập chuỗi thì không cần dấu & , mình hiểu như phần comment code đúng ko nhỉ?
    Có gì sai sót chỉ giúp mình nhé.

  5. #5
    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 : abcd => Chương trình in ra : "abcd" và "TRUE". (1)
    _ 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).

  6. #6
    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);

  7. #7
    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

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •