Announcement

Collapse
No announcement yet.

[C++] in ra chuỗi mất ký tự đầu tiên

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] in ra chuỗi mất ký tự đầu tiên

    tình hình là mấy bũa giờ ko code... bây giờ ngồi code lại thì gặp ngay cái lỗi này..
    bác nào có kinh nghiệm thì xem lại giúp mình nhá....
    thank các bác trước...........

    Code:
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <conio.h>
    
    using namespace std;
    
    class String
    {
    private:
    	char *string;
    	int lenght;
    public:
    	String();
    	String(char *s);
    	~String();
    	String &operator=(const String &);
    	friend istream & operator>>( istream &, String &); 
    	friend ostream & operator<<( ostream &, String &);
    	friend String operator+(const String &, const String &);
    	friend bool operator>(const String &, const String &);
    	friend bool operator<(const String &, const String &);
    	friend bool operator==(const String &, const String &);
    	friend bool operator!=(const String &, const String &);
    	char &operator[](int &);
    };
    
    
    
    /*************************************************************/
    String::String()
    {
    	string = new char[1];
    	string[0]='\0';
    	lenght = 0;
    }
    
    /*************************************************************/
    String::~String()
    {
    	if(string!=NULL)
    		delete []string;
    }
    
    /*************************************************************/
    String::String(char *s)
    {
    	this->lenght = strlen(s);
    	this->string = new char[lenght+1];
    	strcpy(string,s);
    }
    
    /************************************************************/
    istream & operator>>( istream &input, String &s)
    {
    	input.ignore(1);
    	input.getline(s.string,50);
    	return input;
    }
    
    /*************************************************************/
    ostream & operator<<(ostream &output, String &s)
    {
    	output<<s.string;
    	output<<endl;
    	return output;
    }
    /************************************************************/
    String &String::operator=(const String &s)
    {
    	lenght = s.lenght;
    	strcpy(string,s.string);
    	return (*this);
    }
    /*************************************************************/
    String operator+(const String &s1, const String &s2)
    {
    	String Result;
    	Result.lenght = s1.lenght + s2.lenght;
    	Result.string = new char [ Result.lenght+1];
    	for(int i=0; i<s1.lenght; ++i)
    		Result.string[i] = s1.string[i];
    	for(int j=0; j<s2.lenght; ++j)
    		Result.string[s1.lenght+j] = s2.string[j];
    	return Result;
    }
    
    /*************************************************************/
    char &String::operator[](int &x)
    {
    	return string[x];
    }
    
    /**************************************************************/
    bool operator>(const String &s1, const String &s2)
    {
    	if(s1.lenght>s2.lenght)
    		return true;
    	else
    	{
    		if(strcmp(s1.string,s2.string)>0)
    			return true;
    	}
    	
    	return false;
    }
    
    /****************************************************************/
    bool operator<(const String &s1, const String &s2)
    {
    	if(s1.lenght<s2.lenght)
    		return true;
    	else
    	{
    		if(strcmp(s1.string,s2.string)<0)
    			return true;
    	}
    	
    	return false;
    }
    
    /***************************************************************/
    bool operator==(const String &s1, const String &s2)
    {
    	if(strcmp(s1.string,s2.string)==0)
    		return true;
    	return false;
    }
    
    /***************************************************************/
    bool operator!=(const String &s1, const String &s2)
    {
    	if(s1.lenght!=s2.lenght)
    		return true;
    	else
    	{
    		if(strcmp(s1.string,s2.string)!=0)
    			return true;
    	}
    	
    	return false;
    }
    
    int main()
    {
    	String *S1;
    	String S2("Nguyen Binh Khiem");
    	int n;
    
    	cout<<"nhap so chuoi: ";
    	cin>>n;
    
    	S1 = new String[n];
    
    	for(int i=0; i<n; ++i)
    	{
    		cout<<"nhap chuoi thu "<<i+1<<": ";
    		cin>>S1[i];
    	}
    
    	for(int j=0; j<n; ++j)
    	{
    		cout<<"chuoi thu "<<j+1<<" la: ";
    		cout<<S1[j];
    	}
    
    	getch();
    	return 0;
    }

  • #2
    In ra mất kí tự đầu tiên vì lúc nhập đã mất rùi, thử debug thì thấy nhập s1[0] thì ổn, nhưng từ s1[1]... trở đi thì nó bị ăn mất kí tự đầu.
    Xem lại toán tử nhập >>. Dùng cin thay getline thì lại được.
    Thân Lãng Tử Phiêu Du Theo Ngàn Gió,
    Chốn Phiêu Hồng Buông Kiếm Tựa Hồng Nhan

    Đời Đạo Gian

    Comment


    • #3
      Originally posted by 11520246 View Post
      In ra mất kí tự đầu tiên vì lúc nhập đã mất rùi, thử debug thì thấy nhập s1[0] thì ổn, nhưng từ s1[1]... trở đi thì nó bị ăn mất kí tự đầu.
      Xem lại toán tử nhập >>. Dùng cin thay getline thì lại được.
      sừa lại dòng đó sao vậy bạn ơi

      Comment


      • #4
        Sửa lại toán tử nhập như thế này:
        PHP Code:
        istream operator>>( istream &inputString &s
        {     
            
        input.ignore(1);     
            return 
        input.get(s.string,50);      

        Comment


        • #5
          Originally posted by 10520541 View Post
          Sửa lại toán tử nhập như thế này:
          PHP Code:
          istream operator>>( istream &inputString &s
          {     
              
          input.ignore(1);     
              return 
          input.get(s.string,50);      

          thank a nhá...
          a có thể giải thich sao lại code như thế được không....

          Comment


          • #6
            Khanh xem lại chỗ trả về trong khai báo toán tử nạp chồng >>.
            Thử so sánh xem thử cái
            Code:
            return input
            ban đầu của Khanh với cái
            Code:
            return input.get(s.string,50)
            của anh Trung xem thử khác nhau chỗ nào.
            Chắc là ra rùi nhé.
            :smile:
            Thân Lãng Tử Phiêu Du Theo Ngàn Gió,
            Chốn Phiêu Hồng Buông Kiếm Tựa Hồng Nhan

            Đời Đạo Gian

            Comment


            • #7
              Thử cái này xem:
              ****************************************
              istream & operator>>( istream &input, String &s)
              {
              input.getline(s.string,50);
              return input;
              }
              ************************************
              int main()
              {
              String *S1;
              String S2("Nguyen Binh Khiem");
              int n;

              cout<<"nhap so chuoi: ";
              cin>>n;
              cin.ignore();
              S1 = new String[n];

              for(int i=0; i<n; ++i)
              {
              cout<<"nhap chuoi thu "<<i+1<<": ";
              cin>>S1[i];
              }

              for(int j=0; j<n; ++j)
              {
              cout<<"chuoi thu "<<j+1<<" la: ";
              cout<<S1[j];
              }

              getch();
              return 0;
              }

              Comment


              • #8
                giờ mình tìm được cái lỗi đó rồi....
                mệt............
                cảm ơn mọi người nhá

                Comment


                • #9
                  Góp ý cho bạn chút ^^, khi overload toán tử [] người ta thường viết 2 phiên bản 1 phiên bản non-const và 1 phiên bản const, nếu bạn viết như trên thì const object sẽ ko sử dụng đc toán tử [] ^^
                  char& operator[](int &);
                  const char& operator[](int &) const;

                  Code:
                  istream & operator>>( istream &input, String &s) 
                  {     
                      input.ignore(1);     
                      return input.get(s.string,50);      
                  }
                  bạn dùng input.ignore(1) thì nó mất 1 kí tự phải rồi =.=, cái cin.ignore(1) bạn chỉ nên đặt sau khi nhập vào 1 số =cin và biết chắc sau đó sẽ nhập chuỗi
                  Last edited by 11520051; 24-12-2012, 22:29.

                  Comment

                  LHQC

                  Collapse
                  Working...
                  X