Code loại bỏ dấu cách thừa trong xâu bị Runtime Error

Mọi người có thể cho mình biết tại sao lại có lỗi runtime trong đoạn này được không.

Đề bài, bài này là mình loại bỏ các dấu cách thừa giữa, cuối và đầu từ.
Đây là cả file và mình đã đoán được nó làm ở đoạn này :
cả file

#include <stdio.h>
#define MAX 101
#include <string.h>
typedef struct sv{
	char hovaten[53];
}sinhvien;
char *chuan_hoa(char s[]) {
	int i ;
	for( i = 0 ; i < strlen(s); i++) {
		s[i] = toupper(s[i]);
	}
	while (s[0] == ' ') strcpy(&s[0], &s[1]);
	for(i = 0 ; i < strlen(s) - 1; i++) {
		if(s[i] == ' ' && s[i+1] == ' ') {
			strcpy(&s[i], &s[i+1]);
			i--;
		}
	}
	while (s[strlen(s)-1] == ' ') {
		strcpy(&s[strlen(s)-1], &s[strlen(s)]);
	}
	return s;
}

int main() {
	int i, n;
	sinhvien sv[MAX];
	scanf("%d",&n);
	for( i = 0 ; i < n ; i++) {
		fflush(stdin);
		gets(sv[i].hovaten);	
	}
	
	for(i = 0 ; i < n - 1 ; i++) {
		strcpy(sv[i].hovaten,chuan_hoa(sv[i].hovaten));
		printf("%s:%d\n",sv[i].hovaten,strlen(sv[i].hovaten));
	}
	strcpy(sv[n - 1].hovaten,chuan_hoa(sv[n - 1].hovaten));
	printf("%s:%d",sv[n - 1].hovaten,strlen(sv[n - 1].hovaten));
	return 0;
}

Đoạn bị lỗi runtime

	for(i = 0 ; i < strlen(s) - 1; i++) {
		if(s[i] == ' ' && s[i+1] == ' ') {
			strcpy(&s[i], &s[i+1]);
			i--;
		}
	}

Cám ơn mọi người.

Cả strlen()strcpy() đều O(n) time, mà lại đi gọi lại không biết bao nhiêu lần. :kissing:

Bản thân hàm chuan_hoa() đã chỉnh sửa s rồi mà bên dưới còn gọi strcpy(sv[i].hovaten,chuan_hoa(sv[i].hovaten)); làm gì không biết.

Dùng toupper() thì include cả ctype.h nữa. :v :v

Chỉ cần đơn giản v là được r.

char *sher(char *s) {
    if (!s) return NULL;
    int cop = *s != ' ';
    int j = 0;
    
    for (int i = 0; s[i]; ++i) {
        if (s[i] != ' ') cop = 1;
        if (cop) {
            s[j++] = toupper(s[i]);
            cop *= s[i] != ' ';
        }
    }
    
    s[j - (j > 0 && s[j - 1] == ' ')] = '\0';
    return s;
}

Sai ở đây nè. :kissing:

So sánh kiểu int với size_t. :v :v :v
Điều kiện i < strlen(s) - 1s rỗng thì là true nhé. :slight_smile:

4 Likes

cám ơn bạn về những nhận xét quý giá như vậy, thực sự ban đầu mình chỉ muốn là nó chạy đúng đã, chứ chưa quan tâm đến tối ưu. Cám ơn bạn rất nhiều.

1 Like

Để tối mình rảnh mình check lại, vì lâu không code C, quên nhiều quá.

mình đã làm theo cách bạn hướng dẫn, nhưng có vẻ code vẫn bị bug thì phải?

Bug thì bạn up bug lên luôn, bug về gì, err log như thế nào, chứ úp mở gì nữa. :kissing:

4 Likes

à không có gì đâu, cám ơn bạn, bug do mình chưa đưa đúng input .

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