30/09/2018, 16:46

[HỎI] DevC-Xóa khoảng trắng trong chuỗi

  1. (*)Viết chương trình nhập vào 1 chuỗi, cắt ký tự khoảng trắng trong chuỗi sao cho các từ cách nhau bằng 01 khoảng trắng.
    day la code cua mình:

    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
    char s[100];
    int i,n,j,dem,lap=0;
    gets(s);
    dem=0;
    n=strlen(s);
    do
    {
    for(i=0;i<n;i++)
    {
    if((s[i]==’ ‘)&&(s[i+1]==’ '))
    {
    dem++;
    for(j=i;j<n;j++)
    {
    s[j]=s[j+1];
    }
    }
    }
    }
    while(dem==0);
    printf(“Chuoi sau khi cat: ”);
    for(i=0;i<(n-dem);i++)
    {
    printf("%c",s[i]);
    }
    return 0;
    }

nhưng sao nó chỉ xóa được 2 khoảng trắng liên tiếp thôi, nhiều hơn 2 khoảng trắng liên tiếp thì nó chỉ xóa được 1 khoảng trắng,mọi người giúp với xem code mình sai chỗ nào

Minh Hoàng viết 18:47 ngày 30/09/2018
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) 
{
	char s[100]="MOT HAI  BA   NAM";
	int i,n,j,dem,lap=0;
	//gets(s);
	dem=0;
	n=strlen(s);
	//do
	//{
		for(i=0;i<n;i++)
		{
			if((s[i]==' ')&&(s[i+1]==' '))
			{
				//dem++;
				for(j=i;j<n;j++)
				{
					s[j]=s[j+1];
				}
				n--;	//so ki tu cua chuoi giam xuong
				i--;	//sau buoc nay thi i se tang (vong for) nen ta se giam no xuong
			}
		}
		lap++;
	//}
	//while(dem==0);
	printf("Chuoi sau khi cat:\n");
	//for(i=0;i<(n-dem);i++)
	for (i=0;i<n;i++)
	{
		printf("%c",s[i]);
	}
	return 0;
}

do vào vòng for thì i sẽ tăng lên nên i sẽ bị dâng lên, nên mình sẽ i-- nó trước khi vào vòng for
mình cũng sửa chỗ n–, vì n là độ dài của chuỗi nên làm thế cho logic có ảnh hưởng nha
mình thấy vòng while cũng không ổn, nếu như chuỗi không có kí tự space dư thừa thì sẽ bị loop mât… có thể bỏ vòng while đi

Nguyễn Trung Kiệt viết 18:56 ngày 30/09/2018

uh để mình thử lại xem

lúc đầu em cũng dùng vòng for nhưng kết quả vẫn zay nên thử vòng do while thấy cũng chả khác gì :3 hihi

Nguyễn Trung Kiệt viết 18:46 ngày 30/09/2018

sao nó chạy vẫn không đúng nhỉ

Minh Hoàng viết 18:47 ngày 30/09/2018

đúng mà nhỉ “MOT HAI BA NAM” đâu có thiếu nhịp nào đâu

Nguyễn Trung Kiệt viết 18:46 ngày 30/09/2018

xem dùm em sai chỗ nào

Minh Hoàng viết 19:01 ngày 30/09/2018

ra đều tăm tắp mà nhỉ? cho xem kết quả đi bạn

Nguyễn Trung Kiệt viết 19:02 ngày 30/09/2018

Minh Hoàng viết 18:57 ngày 30/09/2018

i-- không phải i++

Nguyễn Trung Kiệt viết 18:59 ngày 30/09/2018

úi giời hèn gì nãy giờ không thấy,thank bác nhiệt tình

Gió viết 18:50 ngày 30/09/2018

Code này hình như không xoá được khoảng trắng đầu và cuối Đề yêu cầu là 2 từ cách nhau mới có khoảng trắng thôi

Nguyễn Trung Kiệt viết 18:53 ngày 30/09/2018

uh thì chỉ cần 2 từ cách nhau bằng 1 khoảng trắng là ok roi
còn cắt đầu và cuối chuỗi thì mình làm được

Minh Hoàng viết 18:46 ngày 30/09/2018

mình fix code của bạn kia thui
cơ mà thêm trường hợp riêng là được mà nhỉ
s[i+1]='\0' cái này để xóa đuôi

s[0]=' ' cái này để xóa đầu

Nguyễn Trung Kiệt viết 18:58 ngày 30/09/2018

Có hàm nào để cắt chuỗi không nhỉ

Minh Hoàng viết 19:00 ngày 30/09/2018

Bạn xem hàm memmove nhé, viết khéo léo sẽ thành hàm xóa kí tự
xem hàm strtok, thường dùng để cắt chuỗi khi gặp kí tự ngắt

Nguyễn Trung Kiệt viết 19:02 ngày 30/09/2018

Giải thích em về hàm strtok dc không anh

Minh Hoàng viết 18:47 ngày 30/09/2018

http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok
ví dụ có một câu "mot hai ba nam" thì lần đầu tiên truyền chuỗi này vào hàm (kí tự delimiter là space ' ') thì chuỗi còn "mot" tuy nhiên các dữ liệu ở phía sau vẫn còn. Lý do là hàm strtok sẽ làm cho các kí tự space tìm được trở thành '\0'. Lần gọi sau thì nó sẽ nhảy tới vị trí kế tiếp, con trỏ sẽ giữ địa chỉ của chuỗi “hai” (tất nhiên là dữ liệu của chuỗi vẫn còn). Đọc example trong link cho dễ hiểu.
Hàm này biến đổi chuỗi nên là chép chuỗi qua chuỗi khác rồi hẵng làm strtok

Nguyễn Trung Kiệt viết 18:47 ngày 30/09/2018

ồ, mở mang duoc kiến thức thank bác lần nữa

Gió viết 18:56 ngày 30/09/2018

Bài này 1 vòng while là ra, sao lại phức tạp thế

#include <stdio.h>
#include <string.h>

int trim(char * s){
   int d=0,i=0,prev=-1;
   while(s[i]){ 
        if(s[i]==' '&& (prev<0|| s[prev]==' ')){
             d++;// 2 ' ' liên tiếp hoăc ' ' ở đầu chuỗi => tăng số kí tự bị xoá
        }else{
             s[i-d]=s[i]; 
             prev=i;
        }
        i++;
   }
   i-=d;// i is new length
    //trim right
   if(i&& s[i-1]==' ') s[i-1]= 0,d++; else s[i]=0;
   return d;
}
int main() {
	char  s[100]="  d   a  b    ";
        int d=trim(s);
        printf("%s# deleted %d char(s)",s,d);
	return 0;
}
Nguyễn Trung Kiệt viết 18:59 ngày 30/09/2018

quan trõng nghĩ ko ra vòng while :))

Nguyễn Trung Kiệt viết 18:59 ngày 30/09/2018

cái hàm strtok chạy ngược từ cuối chuỗi lên đầu chuỗi được không Rock_Hoang

Bài liên quan
0