Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: Khai báo một chuỗi trong lập trình C?

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    13

    Mặc định Khai báo một chuỗi trong lập trình C?

    Các bạn cho mình hỏi khai báo

    C Code:
    1. char *text = "AAAAAAAA";
    với
    C Code:
    1. char text[] = "AAAAAAAA";

    có khác nhau không? mình nghe nói là khai báo char text[]; thì chuỗi sẽ được cất lên stack ko biết có đúng ko, nhờ các bạn giúp đỡ.

  2. #2
    Ngày gia nhập
    03 2009
    Bài viết
    2

    theo mình thì khai báo con trỏ tiết kiệm được vài byte vì chỉ lưu địa chỉ, thay vì lưu cả chuỗi, và cái khác là khi sử dụng truy xuất do con trỏ và mảng là khác nhau cơ bản
    Mr Ngô

  3. #3
    Ngày gia nhập
    03 2009
    Bài viết
    13

    Trích dẫn Nguyên bản được gửi bởi emptycipher Xem bài viết
    theo mình thì khai báo con trỏ tiết kiệm được vài byte vì chỉ lưu địa chỉ, thay vì lưu cả chuỗi,
    Thế cái chuỗi mà nó trỏ đến sẽ nằm ở đâu?? nó có tốn bộ nhớ không? quả thực con trỏ rắc rối thật

  4. #4
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    có khác nhau không? mình nghe nói là khai báo char text[]; thì chuỗi sẽ được cất lên stack ko biết có đúng ko, nhờ các bạn giúp đỡ.
    Theo tối với C thì cả 2 cách khai báo trên đều sai. Sai ở chỗ không thể gán trực tiếp mảng kí tự với một chuỗi hằng.
    C Code:
    1. char text[] = {'A','A','A','A','A','A','A','A'};
    2. or
    3. char text[9]; strcpy(text,"AAAAAAAA");

    Cách thử nhất sử dụng con trỏ thì phải cấp phát vùng nhớ, vì vậy riêng với chuỗi thì tốt nhất cứ dùng cách 2.

  5. #5
    Ngày gia nhập
    03 2009
    Bài viết
    13

    Trích dẫn Nguyên bản được gửi bởi QuangHoang Xem bài viết
    Theo tối với C thì cả 2 cách khai báo trên đều sai. Sai ở chỗ không thể gán trực tiếp mảng kí tự với một chuỗi hằng.
    Sao lại sai nhỉ? chương trình biên dịch ổn thỏa và chạy tốt với lại tài liệu nào cũng nói cách khai báo chuỗi là như vậy mà!

    Trích dẫn Nguyên bản được gửi bởi QuangHoang Xem bài viết
    Cách thử nhất sử dụng con trỏ thì phải cấp phát vùng nhớ, vì vậy riêng với chuỗi thì tốt nhất cứ dùng cách 2.
    Nhưng mình đâu cần tự cấp phát??

    Hi vọng mọi người giúp đỡ, về con trỏ mình còn mù mờ quá...

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Mặc định Khai báo một chuỗi trong lập trình C?

    quang hoàng nói ko sai đâu.
    Trong C thuần túy thì ko cho phép ta làm điều đó, nhưng trong C++ thì ta hoàn toàn có thể làm như thế. đó là phần mở rộng của C++;

    còn bạn khai báo như thế nó vẫn ổn bởi vì cách IDE bây giờ đều là C/C++.

    còn bạn muốn chứng minh điều tôi nói thì đơn giản thôi.
    làm 1 file tên là test.c có nội dung như trên rồi mở với BC xem.
    nó sẽ báo lỗi ngay


    BC coi các file .c là file của C thuần túy
    .cpp là các file của C++


    còn về 2 cách khai báo đó, nó chẳng khác gì nhau đâu........


    @ emptycipher : ko biết thì đừng có tung hỏa mù cho các bạn khác
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    còn về 2 cách khai báo đó, nó chẳng khác gì nhau đâu........
    Có lỗi mà anh, nếu dùng con trỏ mới chuỗi ngắn ngắn như trên thì nó tận dụng phần bộ nhớ còn dư nên sẽ không gặp vấn đề gì, nhưng nếu nhét vào một chuỗi dài một chút chắc chắn sẽ báo lỗi windows.

    @learn: Mình học một lúc cả C và C++ nhưng mình phần biệt rõ ràng cái nào là C cái nào là C++. Mình chưa bao giờ dùng trình biên dịch TC hay BC tuy nhiên cần biệt rõ 2 cái C/C++ theo đúng chuẩn.

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    char* s = "abc" thì nên khai báo là const char* s = "abc";
    Nhưng cái thứ 2 thì strcpy vẫn được ! Thậm chí gán cũng vẫn được mà.

  9. #9
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi QuangHoang Xem bài viết
    Có lỗi mà anh, nếu dùng con trỏ mới chuỗi ngắn ngắn như trên thì nó tận dụng phần bộ nhớ còn dư nên sẽ không gặp vấn đề gì, nhưng nếu nhét vào một chuỗi dài một chút chắc chắn sẽ báo lỗi windows.

    @learn: Mình học một lúc cả C và C++ nhưng mình phần biệt rõ ràng cái nào là C cái nào là C++. Mình chưa bao giờ dùng trình biên dịch TC hay BC tuy nhiên cần biệt rõ 2 cái C/C++ theo đúng chuẩn.
    mình dùng BC, cho chuỗi dài dài vẫn ko có lỗi.....


    theo C thuần túy thì cả 2 cách đều sai, như mình nói ở trên đó, mình test rồi.

    còn trong C++ ( mình dùng BC test)
    PHP Code:
    char p[]="bcc"
    cái này mình thấy có nói trong sách
    nếu khai báo như thế thì p sẽ được cấp phát 4 byte;
    tương đương với char p[4];
    trong C/C++ ko được gán giá trị cho chuỗi như trong pascal nhưng trong khai báo ban đầu thì hoàn toàn có thể.

    còn char *p="abc"; thì mình chưa thấy tài liệu nào đề cập đến. nhưng mình test thử băng BC thì với thì thấy với mỗi cách khai báo thì con trỏ p sẽ trỏ đến vùng nhớ khác nhau, có thể thằng BC nó dễ tính
    ...

    vậy nên tốt nhất là char* thì cần cấp phát và giải phóng theo đúng quy cách




    @chủ topic : quên mất còn 1 điều nữa
    char *p thì p là con trỏ
    char p[] thì p là 1 hằng con trỏ
    Đã được chỉnh sửa lần cuối bởi langman : 09-04-2009 lúc 06:23 PM.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Khi khai báo char* s = "etc" thì s là con trỏ hằng. Code đâu có gì sai ?
    Khởi tạo "ect" chỉ khác { 'e', 't', 'c' } là không có kí tự '\0' thôi.
    Test với gcc không có gì sai cả
    C++ Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. int main()
    5. {
    6.     char* s = "pure C";
    7.     char s1[] = "pure C";
    8.  
    9.     printf( "%s", s );
    10.     printf( "%s", s1 );
    11.    
    12.     return 0;
    13. }

Các đề tài tương tự

  1. Cách khai báo mảng chuỗi trong Asp.Net C#
    Gửi bởi suxedung trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 24-07-2012, 09:47 AM
  2. Lỗi khai báo chuỗi bằng con trỏ VS C++?
    Gửi bởi bvt000 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 21
    Bài viết cuối: 23-06-2012, 04:56 PM
  3. cách khai báo chuỗi chứa ký tự đặc biệt như ' / @ trong asp.net
    Gửi bởi billsang trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 3
    Bài viết cuối: 30-05-2012, 11:51 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. khai báo hàm chuỗi kí tự
    Gửi bởi dungtimtoinua2008 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 05-05-2010, 07:11 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn