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ố 13 kết quả

Đề tài: [C++] Chuỗi bị xoá sau khi sử dụng vòng lặp for ???

  1. #1
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định [C++] Chuỗi bị xoá sau khi sử dụng vòng lặp for ???

    Em có viết chương trình đến mố lần xuất hiện của 1 kí tự trong dãy, tuy rằng biên dịch ngon lành nhưng chạy thử lại cho kết quả sai. Debug thì phát hiện ra
    sau vòng for chuỗi tự động bị xoá. Mong các anh giải đáp giùm.
    Code:
    /*Chuong trinh dem so lan xuat hien cua 1 ki tu trong day*/
    #include "stdio.h"
    void main()
    {
      //Nhap vao chuoi ki tu
      char string[80];
      int dem['Z'];
      printf("\nNhap vao 1 chuoi ki tu: "); gets(string);
    
      for (int i='A'; i<='Z'; dem[i++]=0);
      //Sau dong for nay thi string bi xoa ve "" ?
    
      printf("%s", string);
    
       for(i=0; string[i]!='\0';i++)
          dem[string[i]>'Z'? string[i]-32:string[i]]++;
    
      for (i='A';i<'Z'; i++)
          if (dem[i]) printf("\n%c :%d",i, dem[i]);
    }
    Đã được chỉnh sửa lần cuối bởi hailoc12 : 17-06-2007 lúc 03:01 PM.

  2. #2
    No Avatar
    N.V.T Khách

    Code bạn viết nhìn mờ cả mắt , bạn tham khảo code sau nhé ,mình viết = C++ :
    Code:
    #include <iostream.h>
    #include <string.h>
    void main()
    {	
    	char chuoi[100];
    	char ky_tu_can_kt;
    	int dem = 0 ;
    	
    	cout<<"Nhap vao chuoi:";
    	cin.get(chuoi,100);
    
    	cout<<"Nhap vao ky tu can dem so lan xuat hien :";
    	cin>>ky_tu_can_kt;
    	
    	for (int i = 0 ; i < (strlen(chuoi)) ; i ++ )
    	{
    		if ( chuoi[i] == ky_tu_can_kt )
    		{
    			dem ++;
    		}
    	}
    	cout<<"Ky tu '"<<ky_tu_can_kt<<"' xuat hien trong chuoi "<<dem<<" lan.\n";
    
    
    
    }

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Cám ơn bạn N.V.T đã trả lời, mình đã chỉnh lại code cho dễ nhìn hơn.
    Tuy nhiên câu trả lời của bạn có lẽ chưa thoả mãn những gì mình thắc mắc.
    Mình đã sửa chương trình của bạn một chút, bạn chạy thử sẽ thấy cái lỗi mình cần hỏi
    Code:
    #include <stdio.h>
    #include <iostream.h>
    #include <string.h>
    void main()
    {
    	char chuoi[100];
    	char ky_tu_can_kt;
    //      int dem= 0;
    	int dem['z']  ;
    
    	cout<<"Nhap vao chuoi:";
    	cin.get(chuoi, 100);
    
    	cout<<"Nhap vao ky tu can dem so lan xuat hien :";
    	cin>>ky_tu_can_kt;
    
    	for (int i=0; i<='z'; i++) dem[i]=0;// them dong lenh nay
    	// sau khi chay het thi chuoi bi xoa ve "" ?
    	for (i = 0 ; i < (strlen(chuoi)) ; i ++ )
    	{
    		if ( chuoi[i] == ky_tu_can_kt )
    		{
    			dem[ky_tu_can_kt] ++;
    		}
    	}
    	cout<<"Ky tu '"<<ky_tu_can_kt<<"' xuat hien trong chuoi "<<dem[ky_tu_can_kt]<<" lan.\n";
    
    
    
    }
    Cụ thể mình thay vì dùng biến dem mình đã dùng mảng dem. Sau dòng lệnh gán các phần tử của mảng dem về 0 thì biến chuoi bị xoá khiến cho chương trình chạy sai

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Vòng for của cậu đã viết tràn lên buffer của chuỗi.
    Ở code đầu tiên, cậu khai báo:
    Code:
    int dem['Z']; // tương đương int dem[90], tức từ 0 đến 89 interger
    ....
    for (int i='A'; i<='Z'; dem[i++]=0);
    // tương đương:
    for (int i = 65; i <= 90; i++)
        dem[i] = 0;
    Do đk i <= 90 mà cậu đã ghi đè giá trị 0 lên vùng nhớ có địa chỉ (&dem + 90), và vùng nhớ này chính là strings[0], và chuỗi trở thành rỗng.
    Đây là lỗi out-off-bound, hay gọi cách # là overflow access, một lỗi chết người, cũng khó debug ra.
    Mỗi compiler sinh mã 1 #, cậu đang dùng compiler nào. Nếu cậu dùng VC++ 6, 2002, 2003, 2005 thì bật option sinh mã ASM ra để đọc và sẽ hiểu kỹ hơn, và tui có thể giúp cậu được, còn nếu các C++ compiler cho DOS thì tui thua vì đã không hề thấy mặt của nó trên máy tui gần 10 năm rồi.
    Thứ tự khai báo các biến cục bộ cũng quan trọng, cậu thử hoán vị chúng, giữ nguyên code ở post đầu tiên và xem chúng chạy ra sao. Bật cửa sổ Watch lên, add vào 2 biến dem và strings, cho breakpoint ở lần for 89 và quan sát.

  5. #5
    No Avatar
    N.V.T Khách

    Mình cũng không rõ về lỗi này lắm ,hic khó hiểu quá. Tuy nhiên với code cậu viết , mình chỉ cần khai báo 1 biến linh tinh bất kỳ , ví dụ : int a = 5 chẳng hạn trước vị trí của khai báo int dem['Z']; hoặc cái code cậu sửa lại của mình thì mọi thứ lại chạy ngon lành ! :
    Cụ thể :
    Code:
    /*Chuong trinh dem so lan xuat hien cua 1 ki tu trong day*/
    #include "stdio.h"
    void main()
    {
      //Nhap vao chuoi ki tu
      char string[80];
      int a = 5 ; // Thêm vào đây 
      int dem['Z'];
      printf("\nNhap vao 1 chuoi ki tu: "); gets(string);
    
      for (int i='A'; i<='Z'; dem[i++]=0);
      //Sau dong for nay thi string bi xoa ve "" ?
    
      printf("%s", string);
    
       for(i=0; string[i]!='\0';i++)
          dem[string[i]>'Z'? string[i]-32:string[i]]++;
    
      for (i='A';i<'Z'; i++)
          if (dem[i]) printf("\n%c :%d",i, dem[i]);
    }
    Code:
    #include <stdio.h>
    #include <iostream.h>
    #include <string.h>
    void main()
    {
    	char chuoi[100];
    	char ky_tu_can_kt;
               int linhtinh = 9; //Khai báo thêm
    	int dem['z']  ;
    
    	cout<<"Nhap vao chuoi:";
    	cin.get(chuoi, 100);
    
    	cout<<"Nhap vao ky tu can dem so lan xuat hien :";
    	cin>>ky_tu_can_kt;
    
    	for (int i=0; i<='z'; i++) dem[i]=0;// them dong lenh nay
    	// sau khi chay het thi chuoi bi xoa ve "" ?
    	for (i = 0 ; i < (strlen(chuoi)) ; i ++ )
    	{
    		if ( chuoi[i] == ky_tu_can_kt )
    		{
    			dem[ky_tu_can_kt] ++;
    		}
    	}
    	cout<<"Ky tu '"<<ky_tu_can_kt<<"' xuat hien trong chuoi "<<dem[ky_tu_can_kt]<<" lan.\n";
    
    
    
    }
    Bác nào biết nguyên nhân chỉ cái xem nhỉ ???

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định [C++] Chuỗi bị xoá sau khi sử dụng vòng lặp for ???

    Vậy thì cậu thử debug xem sau vòng for đó, biến linh tinh có giá trị gì. Cậu đọc lại giải thích của tui.

  7. #7
    No Avatar
    N.V.T Khách

    Ở lần for 89 thì a = 0 !

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Các cậu sữa lại vòng for từ: for (...; i <= 'z' (hay <= 'Z')...) thành i < 'z' hay 'Z' là hết.

  9. #9
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Tôi test thử trên Dev C++ thì bài thứ 2 của bạn chạy bình thường, ko có gì cả, xuất ra chuỗi đầy đủ lun. Ko biết compiler của bạn có vấn đề hay ko.
    Tuy nhiên code của bạn hơi lai căng giữa C và C++ hơn nữa nó lại quá phức tạp cho 1 bài đơn giản. Bạn xem qua code của mình nhé, chỉ chỉnh sửa lại 1 tý từ code của bạn, viết lại theo chuẩn C++:
    Code:
    #include <cstdio>
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        int dem = 0;
        cout <<"Nhap vao chuoi: "; fflush(stdin); string s; getline(cin,s);
        cout <<"Nhap vao ky tu can dem so lan xuat hien: "; char kt; cin >>kt;
        for (int i = 0;i < s.size();++i) if (s[i] == kt) ++dem;
        cout <<"Ky tu '"<<kt<<"' xuat hien trong chuoi " <<dem <<" lan.\n";
        cout <<s <<endl;
        system("pause");
        return 0;
    }

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Compiler không có vấn đề gì cả, chỉ là khác cách sinh mã ASM của GCC và Visual C++ thôi. GCC cấp phát và truy xuất các biến cục bộ trên stack khác với các compiler #. Các compiler # thường cấp trên stack vùng nhớ = tổng size của các biến cục bộ, còn GCC thì cấp theo size = size của biến nào lớn nhất, rồi reuse lại. Cậu huynguyen post .exe của cậu lên đâu đó đi.

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

  1. Kỹ thuật C++ Nhập và gán 1 kí tự trong vòng lặp sao cho khi không nhập kí tự thì vòng lặp lại chạy tiếp.
    Gửi bởi note194 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 12-08-2013, 09:11 PM
  2. Bài tập C++ Bỏ khoảng trống thừa trong chuỗi chỉ sử dụng các vòng lặp?
    Gửi bởi moitaplaptrinh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 07-05-2013, 09:51 AM
  3. Cắt chuổi và ghép chuổi có vòng lặp?
    Gửi bởi nguyenvantien87 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 07-02-2013, 11:31 PM
  4. Bài tập C Kiểm tra chuỗi đối xứng , dùng vòng lặp for bị lỗi !
    Gửi bởi n0b0dy.n0l0v3 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 18-07-2012, 10:08 PM
  5. Lập trình C++ giá trị của xâu trong vòng lặp và ngoài vòng lặp khác nhau
    Gửi bởi virus93ttll trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 17
    Bài viết cuối: 14-05-2011, 02:43 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