Xoá khoảng trắng trong chuỗi

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

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

while và for trong C có cấu trúc lệch khá thoải mái nên nói chung nó đều thay thế nhau được :smile: bạn có thể thử chuyển qua lại dễ dàng mà. Bạn dùng sơ đồ khối để dễ hình dung.

không được bạn ơi, mà bạn dùng vào gì mà phải chạy ngược chuỗi?
bạn cũng có thể viết một hàm tương tự như strtok nhưng chạy ngược chuỗi được mà :smile:

I moved a post to a new topic: Đảo ngược chuỗi kí tự

sửa câu if thành if((s[i]==’ ')) xóa bỏ s[i+1] là xong

char s[100]="MOT HAI  BA   NAM";
int i,n,j,dem,lap=0;
printf("Chuoi truoc khi cat:\n");
for(i=0;i<n;i++)
{
    printf("%c",s[i]);
}
//gets(s);
dem=0;
n=strlen(s);
//do
//{
    for(i=0;i<n;i++)
    {
        if((s[i]==' '))
        {
            //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]);
}
for(i=0; i<size; i++){
		if(isblank(a[i]) == true && isblank(a[i+1]) == true){
			for(j=i; j<size; j++){
				a[j] = a[j+1];
			}
			size--;
			i--;
		}
	}
1 Like

bạn ơi cho mình hỏi , sao phải chuyển sang biến j để xóa khoảng trắng z?

Ban hoc den thuat toan xoa 1 phan tu trong mang se hieu

memmove không cho chồng lấn nhé.

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