Sắp xếp từ trong chuỗi

Ace nào tìm giúp mình lỗi bài này với.Mình tìm mãi mà không biết bị lỗi chỗ nào cả
Đề bài là cho một chuỗi gồm các từ giữa các từ là dấu cách hoặc dấu chấm câu ( là các dấu _ , ; : . ) .Yêu cầu: sắp xếp các từ theo độ dài tăng dần và giữa các từ là dấu cách .

#include<conio.h>
#include<stdlib.h>
#include<string.h>

int dau_cham_cau(char s)
{
	int fl = 0;
	switch (s)
	{
	case ' ':fl = 1; break;
	case '.':fl = 1; break;
	case ',':fl = 1; break;
	case ';':fl = 1; break;
	case '-':fl = 1; break;
	case ':':fl = 1; break;
	}
	return fl;
}

int chia_tu(char *s, char w[][40])
{
	char sp[40];
	int j = 0, n = 0,
	l = strlen(s);
	for (int i=0;i<l;i++)
		if (!dau_cham_cau(s[i]))
		{
			sp[j] = s[i];
			j++;
		}
		else
		{
			sp[j] = '\0';
			strcpy(w[n], sp);
			n++;
			j = 0;
		}
	return n;
}


void sap_xep(char w[][40], int n, char*new_s)
{
	char buf[40];
	for (int i = 0; i < n; i++)
	{
	for (int j=0;j<n-i-1;j++)
	{
	if (strlen(w[j]) > strlen(w[j + 1]))
			{
				strcpy(buf, "");
				strcpy(buf, w[j]);
				strcpy(w[j], w[j + 1]);
				strcpy(w[j + 1], buf);
		}
	}
	}
	char blank[] = " ";
	strcpy(new_s, w[0]);
	for (int i = 1; i < n; i++)
	{
		strcat(new_s, blank);
		strcat(new_s, w[i]);
	}
}

int main(void)
{
	int n;
	char s[80], w[40][40];
	printf("nhap chuoi\n");
	gets(s);
	int l = strlen(s);
	char * new_s = (char*)malloc(l);
	n=chia_tu(s, w);
	sap_xep(w,n, new_s);
	puts(new_s);
	getch();
    return 0;
}


Mình nhớ lúc tạo Topic là diễn đàn có nhắc nhở về việc markdown code mà ta ?
Hay bạn lơ đi ?

P/S: Muốn người ta giúp mình (tìm lỗi hay sửa code) thì mình phải giúp người ta trước (làm cho code dễ đọc bằng cách markdown hay upload lên codepad.org hay ideone.com …)

1 Like

xin lỗi bạn vì mình mới dùng nên cái đó mình không nhìn thấy
để giờ mình sửa lại ngay

Sao phần điều kiện là để i < n-i-1 nhỉ ?

Cái này hơi bị ảo @@ Mỗi vòng for nên để dấu ngoặc nhọn bao phủ chứ không nên để chơ vơ như thế :slight_smile:

2 Likes

dùng hàm strtok để tách từ ra cho nhanh bạn, bỏ vào 1 vector hay mảng gì đó rồi tiến hành sort, sau đó xuất ra,

1 Like

mình đã sửa lại rồi bạn nhưng mà vẫn cho ra kết quả sai
mình nghĩ nó bị sai ở chỗ này nhưng mà mình vẫn chưa thể tìm ra lỗi

for (int i=0;i<l;i++)
{
		if (!dau_cham_cau(s[i]))
		{
			sp[j] = s[i];
			j++;
		}
		else
		{
			sp[j] = '\0';
			strcpy(w[n], sp);
			n++;
			j = 0;
		}
	return n;
}

mình sẽ tham khảo cách của bạn.nhưng trong bài của mình thầy giáo chỉ cho phép dùng 3 hàm là strlen strcpy và strcat thôi :grin: :grin:

Dĩ nhiên rồi, vì mình chỉ xem qua hình thức code của bạn thôi, còn thuật toán mình đã xem đâu :smile:
Vì code của bạn chỉ là các vấn đề xử lý chuỗi nên hãy debug đi nhé

1 Like

Thực sự thì mình đã dành rất nhiều thời gian để tìm lỗi rồi nhưng mà vẫn không thấy nên mình mới tìm đến sự giúp đỡ từ diễn đàn

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