Xoá 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:\n");
	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

#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 :smile: 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

1 Like

uh :slight_smile: để 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

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

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

1 Like

xem dùm em sai chỗ nào :sweat:

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

1 Like

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

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

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

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

1 Like

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

1 Like

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

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

1 Like

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

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

1 Like

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

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

1 Like

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

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

#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;
}
2 Likes

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

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?