Xóa kí tự trong chuỗi

Em có thắc mắc về 2 code này

#include <iostream>
#include <string.h>
using namespace std;
void del (char s[500],int index)
{
	int n=strlen(s);
	for (int i=index; i<n; i++)
	{
		s[i] = s[i+1];
	}
	n--;
}

void delspace (char s[500])
{
//here
	int n=strlen(s);
	for (int i=0; i<n;i++)
	{
		if(s[i]==' ' && s[i+1]==' ')
			{
				del (s,i);
				i--;
			}
//endhere
	}
	if (s[0]==' ') del(s,0);
	if (s[strlen(s)-1]==' ') del(s,strlen(s)-1);
}

int main()
{
	char s[500];
	cout<<"Nhap chuoi"<<" ";
	gets(s);
	delspace (s);
	puts(s);
}

#include <iostream>
#include <string.h>
using namespace std;
void del (char s[500],int index)
{
    int n = strlen(s);
    for (int i=index; i<n; i++)
    {
        s[i] = s[i+1];
    }
    n--;
}

void delt (char s[500])
{
//here
    int n = strlen(s);
    for (int i=0; i<n;i++)
    {
        if(s[i]==s[i+1])
        {
            del(s,i);
            i--;
        }
    }
//endhere
}

int main()
{
    char s[500];
    cout<<"Nhap chuoi"<<" ";
    gets(s);
    puts(s);
    delt (s);
    puts(s);
}

Em đánh dấu từ //here đến //in here. Chỗ đó tại sao code trên chạy tốt nhưng code dưới thì lại treo ngay khi vừa nhập chuỗi ạ?

del (s,i); i--; nếu như không có khoảng trống liền nhau thì nó chạy như thế nào nhỉ? em cũng làm tương tự với code dưới del (s,i); i--; nhưng nó lại k chạy

Biến n là biến cục bộ nên em có n-- cũng ko có thay đổi gì. Nên khai báo n là biến toàn cục.

1 Like

Treo là do ký tự \0 ở cuối á.

Vd như mình nhập sherly1001.

Thì s sẽ là sherly1001\0 cũng với các ký tự rác đằng sau \0.

Khi chạy đến i = 7 thì if đúng. Hết hàm del() thì s = sherly101\0\0.

Do dó 2 ký tự \0 ở cuối luôn làm cho if đúng rồi i-- thành ra vòng lặp for bị lặp vô hạn.


Với lại độ phức tạp hàm delspace()delt() là n^2.

Mình làm thì sẽ tạo một buffer rồi bốc từng ký tự của string gốc sang.

void rmspace(char *s) {
    int len = strlen(s);
    char *b = (char*)malloc(len + 1);
    for (int i = 0, j = 0; i <= len; i++, j++) {
        while (s[i] == ' ' && s[i + 1] == ' ' && i < len) i++;
        b[j] = s[i];
    }
    strcpy(s, b);
    free(b);
}

Hàm delt() thì bạn tự nghĩ nốt nha. :slight_smile:

Edit: Không cần buffer. :stuck_out_tongue_closed_eyes:

void rmspace(char *s) {
    int len = strlen(s);
    for (int i = 0, j = 0; i <= len; i++, j++) {
        while (s[i] == ' ' && s[i + 1] == ' ' && i < len) i++;
        s[j] = s[i];
    }
}
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?