30/09/2018, 17:18

Xóa khoảng trắng thừa của chuổi

tìm hoài không ra chổ sai mong mọi người giúp đỡ

    #include<iostream>
    #include<algorithm>
    #include<string>
   using namespace std;
    inline void xoa(char *s,int vt)
    {
    int n=strlen((char *)s.c_str());
    	for(int i=vt;i<n;i++)
    	{
    		s[i+1]=s[i];
    	}
    	s[n-1]='';
    	
    	
    	
    }
    inline char xoatrang(char *s)
    {
    	int n=strlen((char *)s.c_str());
    	for(int i=0;i<n;i++)
    	{
    		if(i==' ')
    		{
    			xoa(s,i);
    		}
    	}
    }
    int main()
    {
    	string s;
    	cout<<"moi ban nhap :";
    	getline(cin,s);
    	cout<<"chuoi vua nhap la 
"<<s;
    cout<<endl;	
    	xoatrang(s);
    	cout<<"chuoi sau khi xoa khoang trang la:
";
    	cout<<s;
    	system("pause");
    	return 0;
    }
... viết 19:32 ngày 30/09/2018

Mình chưa tìm lỗi run-time, mình chỉ nhìn thấy một số điểm cần lưu ý như thế này:

c_str() là hàm để lấy data trong std::string C++ đưa về mảng kí tự trong C (trả về con trỏ vị trí đầu của mảng kí tự đó). Tham số của hàm là kiểu char*, vậy thì khi gọi hàm, bạn nên gọi như thế này

xoatrang(s.c_str());

Và bên trên hàm không cần ép kiểu char* nữa.


kiểu char* thì nó bản chất là con trỏ trỏ đến mảng kí tự rồi, không cần dùng hàm c_str() nữa.

P Os viết 19:28 ngày 30/09/2018

ò ! bạn test-run thử! mình sài dev do máy củ chưa đủ kinh tế mua máy mới để sài visua nên có nhiều hàm trong class string bắt phải ép kiểu cho nó . chuyện ép kiểu hay không điều đó không ảnh hưởng !
mình muốn hỏi bạn chương trình minh chạy là báo lổi dòng này
int n=strlen((char *)s.c_str());
thậm chí mình viết bên c: cũng chay sai

#include<conio.h>
#include<stdio.h>
#include<string.h>
inline void xoa(char *s,int vt)
{
	int n=strlen(s);
	for(int i=vt+1;i<n;i++)
	{
		s[i-1]=s[i];
     
	}
	s[n-1]='\0';
	
	
	
}
inline char xoatrang(char *s)
{
		int n=strlen(s);
	for(int i=0;i<n;i++)
	{
		if(i==' ')
		{
			xoa(s,i);


		}
	}
}
int main()
{
	char s[30];
	printf("moi ban nhap :");
	gets(s);
	printf("chuoi vua nhap la %s\n",s);
	xoatrang(s);
	printf("chuoi sau khi xoa khoang trang la: %s \n",s);
	
getch();
	return 0;
}

bạn giúp mình với

... viết 19:29 ngày 30/09/2018

Như mình đã nói trên, biến s đã là mảng kí tự trong C, mà hàm c_str() dùng để chuyển kiểu std::string C++ về con trỏ trỏ đến mảng kí tự trong C. Nếu đã là con trỏ kiểu char rồi thì dùng hàm c_str() để chuyển về làm gì nữa.

Hơn nữa con trỏ kiểu char không có member function c_str(). Gọi thế bị lỗi là đúng.
Mình đã nói ở trên rồi. Bạn đọc không kĩ hoặc không hiểu rồi phải mất công hỏi lại.

P Os viết 19:32 ngày 30/09/2018

à mình đã hiểu hàm c_str dùng để lấy chuổi string c++ này về để về c chuyển thành kiểu char trong c rồi trả về chuổi ký tự cho c++ để con trỏ *s này trỏ tới vùng nhớ kiểu char này được trả về bản thân con trỏ *s lúc này là chuổi kiểu char rồi nên không cần phải ép cho nó nữa đúng không vậy ! nhưng mình thử rồi vẫn không được

 #include<iostream>
#include<algorithm>
#include<string>

using namespace std;
inline char xoa(char *s,int vt)
{
int n=strlen(s.c_str());
	for(int i=vt+1;i<n;i++)
	{
		s[i-1]=s[i];
	}
	s[n-1]='\0';
	
	
	
}
inline char xoatrang(char *s)
{
int n=strlen(s.c_str());
	for(int i=0;i<n;i++)
	{
		if(i==' ')
		{
			xoa(s,i);
		}
	}

}
int main()
{
	string s;
	cout<<"moi ban nhap :";
	getlen(cin,s);
	cout<<"chuoi vua nhap la \n"<<s;
    cout<<endl;	
    xoatrang(s.c_str());
	cout<<"chuoi sau khi xoa khoang trang la:\n";
	cout<<s;
	system("pause");
	return 0;
}
... viết 19:33 ngày 30/09/2018
int n=strlen(s);
P Os viết 19:22 ngày 30/09/2018

không được bạn ơi ! bên c++ không có thư viện này chỉ có bên c thôi
bên c++ sử dụng hàm của c thông qua 1 cái hàm hay là ở chổ đó nhưng mình bị rối chổ này
buồn thiệt !không biết là sai chổ nào nữa á!

... viết 19:23 ngày 30/09/2018

if(i==’ ')

Sao bạn lại lấy biến i kiểu int ra để so sánh với kí tự Space?

Bạn cần sửa lỗi mà không cho người đọc biết bạn bị lỗi gì rồi bắt người khác phải tìm hết cả project thì ai rãnh tìm giúp bạn.

Nguyễn Duy Khánh viết 19:25 ngày 30/09/2018
  • Bạn muốn dùng các hàm của chuỗi bên C cho C++ thì cần phải có thư viện #include <string.h>
  • Bạn muốn dùng các hàm của chuỗi bên C cho C++ thì biến phải là kiểu string chứ ko phải char *, nếu char * thì dùng luôn các hàm bên C
    Mình nói 2 lỗi chính
Nguyễn Duy Khánh viết 19:30 ngày 30/09/2018

Thuật toán cũng sai, bạn tham khảo


    #include<iostream>
    #include<string.h>
    #include<string>
    using namespace std;
    
    void xoa(string &s, int vt)
    {
    	int n = strlen((char *)s.c_str());
    	for (int i = vt; i < n; i++)
    	{
    		s[i] = s[i + 1];
    	}
    	s[n - 1] = '\0';
    
    }
    void xoatrang(string &s)
    {
    	int n = strlen((char *)s.c_str());
    	for (int i = 0; i < n; i++)
    	{
    		while (s[i] == ' ')
    		{
    			xoa(s, i);
    		}
    	}
    }
    int main()
    {
    	string s;
    	cout << "Moi ban nhap :";
    	fflush(stdin);
    	getline(cin, s);
    
    
    	cout << "Chuoi vua nhap la : " << s;
    	cout << endl;
    	xoatrang(s);
    	cout << "\nChuoi sau khi xoa khoang trang la : ";
    	cout << s;
    	system("pause");
    	return 0;
    }

P Os viết 19:27 ngày 30/09/2018

à mình hiểu rồi bản chất mảng bên c++ là 1 cái lớp thế nên cần phải có tham chiếu truyền vào cho hàm và khi truyền vào là string 2 vấn đề này minh đã hiểu ! hi cám ơn Nguyễn Duy Khánh ha tại vì ông thầy mình zạy bên c mà theo minh được biết là hướng đối tượng xắp tới học là bên c++ nên mình làm quen trước ấy mà !
có gì không hiểu mong giúp đỡ với nha cám ơn ban nhiều Nguyễn Duy Khánh

abcxyz viết 19:29 ngày 30/09/2018

ct này viết bằng c

// xoa space o dau xau, giua xau va cuoi xau, dem tu

#include <conio.h>
#include <stdio.h>
#include <string.h>
//-----------------------------------------------------------------------------------
void void_inputString (char *);
void void_delSpaceF (char *);
void void_delSpaceL (char *);
void void_delSpaceC(char *);
int int_countText(char *);
//-----------------------------------------------------------------------------------
main()
{
	char cStr[50];
	printf ("Nhap xau \n");
	void_inputString(cStr);
	printf ("Xau da nhap \n");
	puts(cStr);
	printf ("Trong xau co %d tu\n",int_countText(cStr) );
	printf ("Xoa ki tu Space o dau xau \n");
	void_delSpaceF(cStr);	
	printf ("Xoa ki tu Space o cuoi xau \n");
	void_delSpaceL(cStr);	
	printf ("Xoa ki tu Space giua xau neu co >2 ki tu space ke nhau \n");
	void_delSpaceC(cStr);
	getch();
}
//-----------------------------------------------------------------------------------
void void_inputString (char *cStr)
{
	fflush(stdin);
	gets(cStr);
}
//-----------------------------------------------------------------------------------
int int_countText(char *cStr)
{
	int i, count =0;
	if(cStr[0]!=' ') count++; 
	for ( i=0 ; i<strlen(cStr) ;i++)
	if (cStr[i] == ' ' && cStr[i+1] != ' ' && cStr[i+1] != '\0') count++;
	return (count);
}
//-----------------------------------------------------------------------------------
void void_delSpaceF (char *cStr)
{
	int i = 0,len;
	len=strlen(cStr);
	printf ("Xau co %d ki tu khi chua xoa \n", len);
    while (cStr[i] ==  ' ' ) 
    {
    	i++;
	}
    if (i != 0) 
    {
    	strcpy (cStr, cStr + i) ;
        puts(cStr);
        len=strlen(cStr);
    	printf ("Xau co %d ki tu khi da xoa %d space dau xau \n \n",len, i);
	}
	else printf ("Dau xau khong co ki tu space \n");
}
//-----------------------------------------------------------------------------------
void void_delSpaceL (char *cStr)
{
	int iCount=0 ,i,iLen,iN;
	iLen= strlen (cStr);
    i = iLen-1;
    printf ("xau co %d ki tu khi chua xoa \n", iLen);
    while (cStr[i] == ' ' )
    {
    	i--;
    	iCount++;
	}
	if (iCount>0)
	{
		iN=iLen-iCount;
		strncpy (cStr, cStr, iN );
		cStr[iN] = '\0';
    	puts(cStr);
    	iLen=strlen(cStr);
    	printf ("xau co %d ki tu khi da xoa %d ki tu space cuoi xau \n", iLen,iCount);
	}
	else printf ("cuoi xau khong co ki tu space \n");
}
//-----------------------------------------------------------------------------------
void void_delSpaceC (char *cStr)
{
	int i,j, iLen, iCount=0;
	iLen= strlen (cStr);
	for (i=0 ;i< iLen ; i++)
	{
		if (cStr [i] == ' ' && cStr [i+1] == ' ' )
		{
			iCount++;
			for (j=i+1; j<=iLen ; j++)
			cStr[j-1]=cStr[j];  // dich chuyen cac phan tu tu j sang trai 1 phan tu de xoa dau cach
			i--; // de quay lai xet tiep xem co dau cach tiep khong
		}
	}
	iLen=strlen (cStr);
	printf ("So phan tu trong xau la %d, da xoa di %d dau space thua o giua xau \n",iLen, iCount);
	puts(cStr);
} 
/*

cach 2 dung them 1 xau khac
void void_delSpaceC (char *cStr)
{
int i,j=0, iLen, iCount=0;
char cNew[100];
iLen= strlen (cStr);
for (i=0 ; iLen ; i++)
{
if (i == 0 ) cNew[j] = cStr[i];
else
{
if (cStr[i] == ’ ’ && cNew[j] == ’ ')
{
iCount++;
}
else
{
j++;
cNew[j] = cStr[i];
}
}
}
iLen=strlen (cNew);
printf (“so phan tu trong xau la %d, da xoa di %d dau space \n”,iLen, iCount);
puts(cNew);
}
*/

Đạt Đỗ viết 19:24 ngày 30/09/2018
  string s;
    cin >> s;
    string tmp;
    for(int i=0;i<s.size();i++) 
          if(s[i]!=' ') tmp+=s[i];
    s.clear();
    s=tmp;
    cout << s << endl;
Phạm Nguyên Huân viết 19:18 ngày 30/09/2018

bạn tham khảo của mình nhé mình làm cho std::string.

 string StandardizeString(string String){
	for (unsigned int i = 0; i < String.length(); i++){
		if (String[i] == '\t'){
			String[i] = ' ';
		}
	}
	while (String[String.length() - 1] == ' '){
		String.erase(String.length() - 1, 1);
	}
	while (String[0] == ' ')
		String.erase(0, 1);
	for (unsigned int i = 0; i < String.length(); i++){
		if (String[i] == ' ' && String[i + 1] == ' '){
			while (String[i + 1] == ' '){
				String.erase(i + 1, 1);
			}
		}
	}
	return String;
}
P Os viết 19:32 ngày 30/09/2018

OKEY! cám ơn mấy anh nhé làm được rồi !

ThÁi NguyỄn ThÀnh viết 19:27 ngày 30/09/2018

cái nầy thì chuẩn không cần chỉnh lun nhá… ^^

#include
using namespace std;
#include<string.h>
void xoakt(char s[], int j)
{
int x = strlen(s);
for (int i = j; i < x; i++)
{
s[i] = s[i + 1];
}
}
int main()
{
int dem = 0;
int j = 0;
char a[255], b[255];
cin.getline(a, 255);
int x = strlen(a);
while (a[0] == ’ ')
{
xoakt(a, 0);
dem++;
}
for (int i = 0; i < x; i++)
{
if (a[i] != ’ ’ || a[i + 1] != ’ ')
{
a[j] = a[i];
j++;
}
}
strncpy_s(b, a,j);
cout << b;
system(“pause”);
return 0;

}

*grab popcorn* viết 19:33 ngày 30/09/2018

A post was merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

Bài liên quan
0