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

Đề tài: lỗi Null pointer assignmemt

  1. #1
    Ngày gia nhập
    10 2006
    Nơi ở
    Bốn biển là nhà
    Bài viết
    36

    Mặc định lỗi Null pointer assignmemt

    C++ Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<iostream.h>
    4. #include<string.h>
    5. typedef char *string;
    6. char *chinhstr(string ch)
    7.   {
    8.    int i;
    9.    while(!(((ch[0] >= 'a')&&(ch[0] <= 'z'))||((ch[0] >= 'A')&&(ch[0] <= 'Z'))))
    10.      {
    11.     for(i=0;i<strlen(ch);i++)
    12.       ch[i]=ch[i+1];
    13.      }
    14.    while(ch[strlen(ch)-1] == ' ')
    15.      {
    16.     ch[strlen(ch)-1]='\0';
    17.      }
    18.    return ch;
    19.   }
    20. int findstr(string cha,string chb,int vitri)
    21.   {
    22.     int flag,poss;
    23.     flag=0;
    24.     poss=-1;
    25.     for(int i=vitri;i<strlen(cha);i++)
    26.        {
    27.      if(cha[i]==chb[0])
    28.        {
    29.          poss = i;
    30.          for(int j=1;j<(strlen(chb));j++)
    31.         if(cha[i+j]!=chb[j])
    32.            {
    33.              poss=-1;
    34.              flag+=1;
    35.              }
    36.            else
    37.             {
    38.              flag+=0;
    39.             }
    40.          if(flag==0)
    41.           {
    42.            poss=poss;
    43.            break;
    44.           }
    45.        }
    46.     }
    47.     return poss;
    48.   }
    49. char *deletestr(string chs,string cha,int solan,int vitri)
    50.   {
    51.     int i;
    52.     while(findstr(chs,cha,vitri)!=-1)
    53.       {
    54.      for(i=findstr(chs,cha,vitri);i<strlen(chs)-strlen(cha)-1;i++)
    55.         chs[i]=chs[i+strlen(cha)+1];
    56.      chs[strlen(chs)-strlen(cha)-1]='\0';
    57.      if(solan==1)
    58.        break;
    59.        }
    60.     chinhstr(chs);
    61.     return chs;
    62.   }
    63. char *cutbefore(string chs)
    64.   {
    65.     int i;
    66.     string cha;
    67.     for(i=0;i<strlen(chs);i++)
    68.       {
    69.     if(chs[i]==' ')
    70.       break;
    71.      else cha[i]=chs[i];
    72.       }
    73.     strcpy(chs,cha);
    74.     chs[i]='\0';
    75.     chinhstr(chs);
    76.     return chs;
    77.   }  
    78. void main()
    79. {
    80.   string s,a;
    81.   cout<<"cho chuooi vao"<<endl;
    82.   gets(s);
    83.   strcpy(a,s);
    84.   cout<<"\n xau vao :"<<a<<endl;
    85.   cutbefore(a);
    86.   cout<<"\n vi tri chuoi hello trong s"<<findstr(s,"hello",0)<<endl;
    87.   cout<<a<<endl;
    88.   cout<<strlen(a)<<endl;
    89.   deletestr(s,a,1,0);
    90.   cout<<"chuoi sau khi delete :"<<s<<endl;
    91.   getch();
    92. }

    -------------------------------------------------------------------------------
    đến khi run thì nó vẫn cho kết quả đúng ,nhưng kết thúc quá trình run thì nó báo Null pointer assignmemt và thoát khỏi DOS.
    Có ai biết chỉ dùm lỗi và cách giải quyết nó.
    thanks.!

    Vui lòng để code vào trong tag code. Đọc Nội quy để biết thêm chi tiết
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 14-05-2008 lúc 11:05 PM. Lý do: Nhắc nhở
    ... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...

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

    Đọc sơ vào thì tình hình là
    typedef char *string;
    ......
    C++ Code:
    1. void main()
    2. {
    3.   string s,a;
    4.   cout<<"cho chuooi vao"<<endl;
    5.   gets(s);
    6. ...
    char* có dữ liệu gì ở đây không vậy cậu ?
    Và 1 câu hỏi nữa là cậu dùng C++ thì tui nghĩ cậu nên dùng #include <string>.
    Còn sai chỗ nào nữa thì tui chưa có thời gian coi hết. Cậu coi lại chỗ đó đã !
    - Với lại tui nghĩ cậu nên biết poor-performance của gets(), dùng cin.getline().
    - Pass đối vào hàm nếu không có ý định modify, thêm keyword *const* vào.
    - Trong C++ không có headfile .h.
    chỗ này :
    C++ Code:
    1.  while (ch[strlen(ch)-1] == ' ')
    Trong hàm cậu dùng strlen( ) rất nhiều, vậy cứ mỗi lần xài là mỗi lần compiler phải tính lại giá trị này à ? Tại sao không dùng 1 biến giữ lại giá trị đó ?
    Đã được chỉnh sửa lần cuối bởi rox_rook : 15-05-2008 lúc 12:10 AM.

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

    Code này lỗi đầu tiên là con trỏ chưa hề được cấp phát mà lấy dùng như không !
    Còn cái hàm này :
    C++ Code:
    1. char *chinhstr(string ch)
    2.   {
    3.    int i;
    4.    while(!(((ch[0] >= 'a')&&(ch[0] <= 'z'))||((ch[0] >= 'A')&&(ch[0] <= 'Z'))))
    5.      {
    6.     for(i=0;i<strlen(ch);i++)
    7.       ch[i]=ch[i+1];
    8.      }
    9.    while(ch[strlen(ch)-1] == ' ')
    10.      {
    11.     ch[strlen(ch)-1]='\0';
    12.      }
    13.    return ch;
    14.   }
    Tui chẳng hiểu cậu muốn edit gì ở đây ? Cả dòng này tui đoán chắc là muốn nó phải là chữ ?
    C++ Code:
    1.  while(!(((ch[0] >= 'a')&&(ch[0] <= 'z'))||((ch[0] >= 'A')&&(ch[0] <= 'Z'))))
    Vậy sao không xài isalpha() ?
    Code viết quá tối nghĩa, hàm dưới thì cậu lại dùng :
    C++ Code:
    1.  flag+=0;
    Tại sao phải cộng += 0 ?
    Hàm đó là tìm vị trí chuỗi con trong vị trí chuỗi cha, tại sao nó có 1 biến vitri = 0 vậy ?
    C++ Code:
    1. cout<<"\n vi tri chuoi hello trong s"<<findstr(s,"hello",0)<<endl;
    0 mang ý nghĩa gì chỗ này ?
    Hàm xóa chuỗi thì nên có check range vị trí cần xóa, giả nếu vị trí quá độ dài của chuỗi thì không biết chuyện gì xảy ra. Tui check hàm đầu tiên và dừng tại đây vì khi tui chưa hiểu ý tưởng của cậu thì có tiếp tục sữa cũng vô nghĩa ! Tui demo cho cậu cách input string, cậu post idea lên đây tui sẽ coi tiếp.
    C++ Code:
    1. #include <iostream>
    2. #include <cstring>
    3.  
    4. char* editString( char* str )
    5. {
    6.     int s_len = strlen( str );
    7.    
    8.     while(  !(  ( ( str[ 0 ] >= 'a' ) && ( str[ 0 ] <= 'z' ) )
    9.                 ||
    10.                 ( ( str[ 0 ] >= 'A' ) && ( str[ 0 ] <= 'Z' ) )
    11.              )
    12.          )
    13.     {
    14.         for( int x = 0; x < s_len; ++x)
    15.             str[ x ] = str[ x + 1 ];
    16.     }
    17.  
    18.     while( str[ s_len - 1 ] == ' ')
    19.     {
    20.         str[ s_len - 1 ] = '\0';
    21.     }
    22.    
    23.     return str;
    24. }
    25.  
    26. int main()
    27. {
    28.     char* s;
    29.     int   str_size;
    30.    
    31.     std::cout << "Enter size of string :\n";
    32.     std::cin >> str_size;
    33.  
    34.     std::cin.ignore( 80, '\n');
    35.    
    36.     s = new char[ str_size ];
    37.    
    38.     std::cout << "Enter a string : \n";
    39.     std::cin.getline( s, str_size );
    40.    
    41.     editString( s );
    42.  
    43.     std::cout << "After edit :\n";
    44.     std::cout << s << "\n";
    45.  
    46.     delete[] s;
    47. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 15-05-2008 lúc 06:51 AM.

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Bốn biển là nhà
    Bài viết
    36

    mấy cái hàm này tui viết để nhằm xử lý xâu chuỗi, nó liên quan đến cái bài tập mà tui đang làm.
    trong đó yêu cầu phải xử lý cặn kẽ về xâu:
    ví dụ xâu vào:
    phthinh thanks everybody.
    thì phải thực hiện được các công việc:
    - cắt được phthinh, thanks , và everybody ra khỏi xâu
    - tìm xem trong xâu vào đó có chuổi con a nào đó không (mà chuổi con này được nhập vào bất kỳ ,ví dụ như chuổi :phthinh chẳng hạn), ngoài ra còn cho phép tìm một ký tự mà ,bỏ qua một số ký tự nhất định (bắt đầu từ một vị trí định trước, như tìm chữ 'h' mà chữ này không thuộc xâu con là phthinh chẳng hạn...), bởi vậy mình mới viết hàm findstr(string a, string b,int vitri), cái này có thể kết hợp tìm cả chuổi con lẫn cả một ký tự (ký tự được xem như chuổi có độ dài là 1).còn 0 chính là tìm từ vị trí đầu chuổi!
    xâu vào là nhập bất kỳ từ bàn phím , xâu đó bao gồm cả những ký tự đặc biệt.và độ dài xâu vào là không xác định.(chương trình yêu cầu xử lý nhiều xâu vào cùng một lúc nên mình định nghĩa kiểu string cho tiện thôi)
    - còn cái vụ mà code tối nghĩa đó chắc do bác chưa quen thôi chứ tui đưa cho mấy đứa bạn , bọn chúng đều biết được đoạn code trên tui muốn làm gì.
    - còn cái hàm isalpha() thì quả thực tui không biết nhiều hàm của C và C++ lắm, với lại tui không quen dùng những thứ có sẵn, tui thích dùng những thú mà mình tạo ra, khi đó mình có thể tùy biến nó theo ý mình chứ không nhất thiết phải đi theo nhưng đường mà họ đã vạch ra. với lại cứ mỗi lần muốn dùng hàm nào đó lại phải đi tìm xem trong ngôn ngữ đó có hàm đó hay không à? phải tự viết lấy mấy cái mà dùng riêng chứ!
    và còn nhiều chức năng khác nữa nhưng mình chỉ đưa lên chừng này thôi !
    còn tại sao không dùng một biến toàn cục để lưu giá trị strlen(a) ư, cái này mình cũng đã làm, nhưng do số lượng biến toàn cục trong chương trình mình nhiều quá rồi(đoạn code này chỉ chiếm chưa đầy 1/10 cái chương trình thôi )
    cảm ơn mọi người đã góp ý nha!,nếu ai có ý kiến nào hay hơn thì xin chỉ dùm tiếp
    Đã được chỉnh sửa lần cuối bởi phthinh : 15-05-2008 lúc 08:54 AM.
    ... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    Bốn biển là nhà
    Bài viết
    36

    cảm ơn các bác nghe, code trên đã có cao nhân chỉ điểm rồi, chạy ok luôn ,không mắc lỗi nữa!
    chỉ cần thêm hàm malloc() vào là chạy ngon ơ
    Đã được chỉnh sửa lần cuối bởi phthinh : 15-05-2008 lúc 09:05 AM.
    ... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...

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

    Mặc định lỗi Null pointer assignmemt

    cảm ơn các bác nghe, code trên đã có cao nhân chỉ điểm rồi, chạy ok luôn ,không mắc lỗi nữa!
    chỉ cần thêm hàm malloc() vào là chạy ngon ơ
    Nếu cậu nói bỏ malloc vào chạy ngon ơ, mà cao nhân này đọc code này mà cũng làm thinh bỏ vào malloc thì tui cũng chẳng nghĩ người này là cao nhân đâu ! Vấn đề không phải là tui bắt bẻ cậu mà là tui phân tích code cho cậu hiểu, cậu dùng C++ viết code, mà cậu nói bỏ malloc vào thì tui đầu hàng.
    - Còn tạo 1 biến cần gì phải là global. Xét đoạn code của cậu xem. Hàm strlen nó đại loại thế này
    C++ Code:
    1.  
    2. unsigned strlen( char const* s )
    3. {
    4.     int count = 0;
    5.     for(; *s != '\0'; ++s )
    6.         count++;
    7.     return count;
    8. }
    Mỗi lần cậu gọi hàm strlen( s ) thì tất nhiên sẽ có 1 vòng for được gọi để tính độ dài, vậy chuỗi cậu dài chừng 80 kí tự, gọi hàm chừng 1 chục lần thì cậu nhân lên thử xem.
    C++ Code:
    1. char *chinhstr(string ch)
    2.   {
    3.    int i;
    4.    while(!(((ch[0] >= 'a')&&(ch[0] <= 'z'))||((ch[0] >= 'A')&&(ch[0] <= 'Z'))))
    5.      {
    6.     for(i=0;i<strlen(ch);i++)
    7.       ch[i]=ch[i+1];
    8.      }
    9.    while(ch[strlen(ch)-1] == ' ')
    10.      {
    11.     ch[strlen(ch)-1]='\0';
    12.      }
    13.    return ch;
    14.   }
    Tạo 1 biến glocal không được sao ?
    - còn cái hàm isalpha() thì quả thực tui không biết nhiều hàm của C và C++ lắm, với lại tui không quen dùng những thứ có sẵn, tui thích dùng những thú mà mình tạo ra, khi đó mình có thể tùy biến nó theo ý mình chứ không nhất thiết phải đi theo nhưng đường mà họ đã vạch ra. với lại cứ mỗi lần muốn dùng hàm nào đó lại phải đi tìm xem trong ngôn ngữ đó có hàm đó hay không à? phải tự viết lấy mấy cái mà dùng riêng chứ!
    và còn nhiều chức năng khác nữa nhưng mình chỉ đưa lên chừng này thôi !
    Vậy sao cậu không viết cả hàm strlen và strcpy luôn để xài cho tiện ? Cậu có hiểu thế nào là code tối nghĩa và code cần viết không ?
    Tui nói thì cậu nghĩ tui bắt bẻ vặt vãnh, khi học đến secure code, design pattern rùi sẽ hiểu.
    Mà thôi, tui cảm thấy tui không có sức để cãi nữa, vì cãi rùi lại nói tui dạy đời. Mấy câu hay đem cao nhân ra hù doạ tui sợ lắm. Good luck !

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    Bốn biển là nhà
    Bài viết
    36

    có lẽ bác nói đúng . vì tuy không thích xài của có sẵn ,nên tui đã viết riêng cho mình một số thư viện để dùng khi cần rồi
    ... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...

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

  1. nhân 2 ma trận, chạy bị lỗi Null pointer assignment?
    Gửi bởi srmnn trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 18-02-2012, 11:05 PM
  2. (p = strtok(NULL, " ")!=NULL có ý nghĩa gì?
    Gửi bởi manhhao19 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 10-10-2011, 08:03 PM
  3. Viết lại một số hàm cơ bản về xâu ký tự lỗi Null pointer assignment?
    Gửi bởi khucnam trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 3
    Bài viết cuối: 13-09-2011, 09:12 AM
  4. Tại sao phát trinh lỗi "Null pointer assignment" và cách khác phục.
    Gửi bởi nguoirung1.6 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 24-04-2011, 12:36 AM
  5. Trong lúc xuất ma trận bị lỗi null pointer assignment
    Gửi bởi tquang620 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 17-06-2009, 09:04 AM

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