Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Hàm strcat & hàm trả về kiểu chuỗi "char* " ???

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

    Question Hàm strcat & hàm trả về kiểu chuỗi "char* " ???

    xin chào mọi người,
    em đang code bài đặt tên cho file nhưng lại bị lỗi . Xin mọi người giúp đỡ

    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <fstream>
    4. using namespace std;
    5.  
    6. char* Filename(int n)
    7. {
    8.     char ten1[20]= "output_";
    9.     char c[10];
    10.     itoa(n,c,10);
    11.     char ten2[20]="_so.txt";
    12.     char *filename = new char [50];
    13.     filename= strcat(ten1,c);
    14.     filename= strcat(filename,ten2);
    15.    
    16.     return filename;
    17.  
    18. }
    19. void main()
    20. {
    21.     int n = 500;
    22.     char* name = new char [50];
    23.     name = Filename(n);
    24.        
    25. //      ofstream fout;
    26. //      fout.open(name);
    27. //  ...
    28.     cout<<name;// ko xuat ra duoc :(
    29.     delete []name;
    30.    
    31. }

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    C++ Code:
    1. char* Filename(int n)
    2. {
    3.     char ten1[20]= "output_";
    4.     char c[10];
    5.     itoa(n,c,10);
    6.     char ten2[20]="_so.txt";
    7.     char *filename = new char [50];
    8.    
    9.     strcpy(filename, ten1);
    10.     strcat(filename, c);
    11.     strcat(filename,ten2);
    12.    
    13.     return filename;
    14.  
    15. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    C++ Code:
    1. char *strcat(char *str1,const char *str2)
    Hàm trên sẽ nối xâu str2 vào xâu str1 và trả về địa chỉ trỏ vào xâu str1. Vì thế cho nên trong hàm Filename mà bạn viết
    C++ Code:
    1.  
    2. char ten1[20]= "output_"; //Xâu ten1 là biến cục bộ trong hàm và được cấp phát trên bộ nhớ Stack
    3. //..... other statements
    4. char *filename = new char [50]; //Cố gắng cấp phát bộ nhớ cho xâu filename
    5. filename= strcat(ten1,c); /*hàm strcat nối xâu c vào cuối xâu ten1 và trả về địa chỉ đầu xâu ten1  OK, con trỏ filename sẽ được được trỏ vào xâu ten1. Chỗ này bạn cố gắng gán nội dung xâu filename là nội dung kết quả của việc nối 2 xâu ten1 và c, nhưng bạn hiểu sai bản chất con trỏ dẫn tới bạn chỉ gán địa chỉ của xâu  filename chứ không phải là copy nội dung của xâu strcat(ten1,c) vào filename
    6. Để fix bạn có thể sửa dòng code trên bằng thay statement filename=strcat(ten1,c) bằng strcpy(filename,strcat(ten1,c));
    7. */
    8.  
    9.     filename= strcat(filename,ten2); // Bận nối tiếp xâu ten2 vào xâu được trỏ bởi con trỏ filename (chính là xâu ten1, vì lệnh filename=strcat(ten1,c); trả về cho bạn là địa chỉ của xâu ten1. Tức là trước khi thực hiện lệnh    filename= strcat(filename,ten2); thì filename==ten1. Dẫn đến sau lệnh này con trỏ filename vẫn trỏ vào [COLOR="Red"]xâu cục bộ ten1[/COLOR].
    10.     return filename; //Bạn cố gắng trả lại địa chỉ của xâu mới đã cấp phát, xong các lệnh bạn thực hiện phía trên kết quả là filename vẫn trỏ vào xâu cục bộ là ten1. Vùng nhớ mà bạn cấp phát cho xâu filename đã bị lãng phí.

    Đến khi bạn thực hiện lời gọi hàm như sau:
    C++ Code:
    1. void main()
    2. {
    3.     int n = 500;
    4.     char* name = new char [50];
    5.     name = Filename(n); /*Cái này gọi thì ok nhưng con trỏ name trả về địa chỉ cục bộ của xâu ten1 (trong hàm Filename), mà ten1 la biến cục bộ với hàm trên (nó được cấp phát trên Stack) nên sau khi gọi xong hàm, Stack được tự động giải phóng = > địa chỉ mà name trỏ vào không còn hợp lệ */
    6.        
    7.     cout<<name;// ko xuat ra duoc :( (Điều trên giải thích cho lệnh trên của bạn không xuất ra được)
    8.     delete []name;
    9.    
    10. }

    Để fix lỗi tôi đề nghị bạn thay file=strcat(ten1,c) bằng strcpy(filename,strcat(ten1,c)); để sao chép nội dung xâu thu được sau khi nối vào vùng nhớ được trỏ bởi filename( sau khi đã cấp phát bằng new) chứ không phải là gán con trỏ filename vào 1 vùng nhớ có sẵn.


    Lời khuyên:
    1.Bạn nên xem xét lại bản chất con trỏ.
    2.Biến cục bộ (cấp trên stack) và biến được cấp phát trên (Heap)

  4. #4
    Ngày gia nhập
    04 2011
    Bài viết
    13

    ac, ko ngờ e lại bị sai chỗ đó. đc biết thêm 1 điều hay..
    Cám ơn anh nhìu nhìu ^^

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    Trích dẫn Nguyên bản được gửi bởi kem92 Xem bài viết
    ac, ko ngờ e lại bị sai chỗ đó. đc biết thêm 1 điều hay..
    Cám ơn anh nhìu nhìu ^^
    Những lỗi thế này khi lập trình là lỗi khá dễ mắc phải. Để tránh lỗi thế này bạn có thể xài lớp std::string. Nó cấp phát tự động, có copy constructor cho phép copy đối tượng theo dạng deepth-copy. Nên nếu thao tác với con trỏ bạn nên chú ý và đọc kỹ tài liệu về các hàm.

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

  1. ADO.NET Lấy object từ 1 chuỗi string "sTableName" và 1 khóa chính "iID"
    Gửi bởi babylovehack trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 14-08-2013, 04:53 PM
  2. Kỹ thuật C có sự khác nhau giữa char *s="chuoi" và char s[]="chuoi" không??
    Gửi bởi losetowin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 02-11-2012, 09:51 PM
  3. Bỏ dấu "/" và "-" trong hàm char
    Gửi bởi Tung93tn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 23-09-2011, 08:33 AM
  4. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 PM
  5. bài tập "đảo chuổi" và "chuyển từ thập phân sang nhị phân"
    Gửi bởi ronnei trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 21-03-2011, 09:55 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