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 10 của 10
  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

    Về việc sử dụng con trỏ cho chuỗi

    Mình muốn đọc 1 chuỗi gồm tối đa 5 kí tự vào 1 vị trí trong mảng 1 chiều và phải có xài con trỏ để cấp phát động. Mình có làm thử ra như thế này:
    Mã:
    struct SArray	// Mảng lưu trữ tên ga
    {
    	char *a[5];
    	int num;
    };
    Nhưng khi bắt đầu khởi tạo cho mảng thì lại sai:
    Mã:
    void initArray(SArray &ma)		// khởi  tạo  cho  mảng  bao  gồm  số phần tử của mảng và con trỏ mảng
    {
    	ma.a = NULL;  -> Dòng báo lỗi
    	ma.num = -1;
    }
    Bạn nào giúp mình fix lỗi này. Thanks.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    a là hằng con trỏ => toạch [IMG]images/smilies/smile.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    a là hằng con trỏ => toạch [IMG]images/smilies/smile.png[/IMG]
    Vậy mình phải sửa sao để vẫn xài được vậy bạn? Với lại cho mình hỏi là mình muốn xài con trỏ cho chuỗi thì khi khai báo, cấp phát như thế nào? Mình hay cấp phát cho con trỏ bằng new.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi gialoui
    Vậy mình phải sửa sao để vẫn xài được vậy bạn?
    char** a ;

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    char** a ;
    Khai báo như vậy là a lúc này có phải là chuỗi ko bạn?

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Lúc này a gọi là con trỏ đến các chuỗi.
    Vậy lúc này mình sẽ cấp phát và sử dụng trong fscanf_s như thế nào vậy bạn? Mình chưa rành về con trỏ lắm [IMG]images/smilies/smile.png[/IMG] Thanks

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    fgets chuẩn hơn.

    Lưu ý là khi bạn viết char* a[5] thì có nghĩa là mảng gồm 5 con trỏ char* (nói cách khác là 5 chuỗi) chứ ko phải là mảng các chuỗi 5 kí tự.

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

    Mình muốn đọc 1 chuỗi gồm tối đa 5 kí tự vào 1 vị trí trong mảng 1 chiều và phải có xài con trỏ để cấp phát động.
    Bạn làm sai về bản chất: char *a[5] tức là một mảng 5 phần tử, mỗi phần tử là một con trỏ trỏ tới vùng nhớ chưa một xâu.
    Muốn làm như ý của bạn tức là số xâu không hạn chế và mỗi xâu chứa tối đa 5 phần tử thì bạn phải khai báo là
    Mã:
    char **a;
    Còn khi bạn muốn gán phần tử thứ i của mảng các xâu (sau khi đã cấp phát động) cho một cái tên nào đó có 5 ký tự thì bạn sẽ làm như sau:
    Mã:
    char s[6] /*   Phải là 6 phần tử, vì xâu chứa tối đa 5 ký tự + 1 ký tự kết thúc xâu (NULL)   */
    gets(s);
    a[i] = s;  /*   a[i] trỏ tới vùng nhớ của s   */

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chuỗi tối đa 5 ký tự thì phải là char [6] chứ sao là char[5] được...

    sửa lại thì đơn giản thêm dấu () thôi. C đọc từ phải qua trái. Viết là char* a[6] thì chương trình nó hiểu là a là mảng chứa 6 con trỏ trỏ tới ký tự. Viết là char (*a)[6] thì nó sẽ hiểu là a là con trỏ trỏ tới mảng chứa 6 ký tự (ưu tiên đọc trong () trước rồi mới phải qua trái sau)

    char* a[6]
    a: biến a là
    đọc từ phải qua trái
    [6]: mảng chứa 6
    *: con trỏ trỏ tới
    char: ký tự
    ghép lại là "biến a là mảng chứa 6 con trỏ trỏ tới ký tự"

    char (*a)[6]
    a: biến a là
    xét trong dấu () trước
    *: con trỏ trỏ tới
    xong trong dấu ngoặc, xét ra ngoài bình thường từ phải sang trái:
    [6]: mảng chứa 6
    char: ký tự
    ghép lại là "biến a là con trỏ trỏ tới mảng chứa 6 ký tự"



    ngữ pháp của C/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
  •