Code chuẩn hoá xâu (xoá kí tự space thừa) bị runtime error

Lỗi runtime error. Mọi người cho em hỏi code của em sai ở đâu mà lại có lỗi này ạ. Em chạy trên Devc++ thì vẫn được mà chạy trên codeforces thì sai ạ

#include<stdio.h>
#include<string.h>
#define Max 51
char xoa(char str[],int vt){
	int i=0;
	int n=strlen(str);
	for(i=vt+1;i<n;i++){
		str[i-1]=str[i];
		}
		str[n-1]='\0';}
		
void xoadaudong(char str[]){
	while(str[0]==' '){
		xoa(str,0);
		}
		}
void xoacuoidong(char str[]){
	while(str[strlen(str)-1]== ' '){
		xoa(str,strlen(str)-1);
		}
		}
void xoagiuadong(char str[]){
	int k=0;
	for(k=0;k<=strlen(str)-1;k++){
		if(str[k]==' ' && str[k+1]==' '){
			xoa(str,k);
			k--;
			}
			}
			}
int main(){
 	char str[100][Max];
 	int n,i=0;
 	do{
 	scanf("%d", &n);
	 }while(n<=0||n>100);
	 fflush(stdin);
 	for(i=0;i<=n-1;i++){
 	gets(str[i]);	
	}
	for(i=0;i<=n-1;i++){
	xoadaudong(str[i]);
	xoacuoidong(str[i]);
	xoagiuadong(str[i]);
	printf("%s:%d\n", strupr(str[i]),strlen(str[i]));}
	 return 0;
}

Bỏ ngay dòng này đi. Có lẽ dòng này gây runtime error đấy.

Test (luôn) cho đúng theo limit rồi, không cần làm trò này đâu.

Tại sao không for đến < n?

Ồ, nếu strlen(str) == 0 thì sao?

3 Likes

nếu bỏ fflush thì nó bị lỗi trôi lệnh, trên codeforces hình như nếu ko làm vòng while thì vẫn có thể bị sai test.

Bạn biết fflush(stdin) làm gì không?
Cái mà bạn gọi là “trôi lệnh” đấy, vì sao nó xảy ra?
Thực sự trả lời được 2 câu này thì bạn sẽ không dùng fflush(stdin) nữa.

Bài này từng có 1 bạn hỏi mình trên facebook rồi, đúng bài này luôn, và không có đoạn dùng do - while để nhập đâu.

1 Like

do có một bước nhập n ở trên nên phải dùng fllush nếu ko có thể sẽ không nhập được chuỗi.

nhưng mình nghĩ đoạn do while cũng không quá quan trọng.

Vì sao lại như vậy? Hàm nhập số nó “ăn” mất cái gì nên phải dùng fflush(stdin)? :thinking:

1 Like

do hàm gets nó sẽ đọc ký tự\n khi nhập dẫn tới ko thể nhập được chuỗi vì vậy mình nghĩ nên dùng fflush để đọc \n tương tự với việc dùng getchar khi dùng fgets

1 Like

Thế thì bạn chỉ cần đọc kí tự \n thôi. fflush() thường dùng cho ghi (write) vào luồng (ouput). Rất nhiều trình biên dịch khi gọi fflush() với stdin (đọc) thì chẳng có tác dụng gì cả.
scanf() đọc được \n đấy.

Còn nữa: strupr() không phải là hàm tiêu chuẩn. Không thể chạy trên mọi nền tảng.

Mấy trang biên dịch trực tuyến hầu hết chạy trên nền Linux, mấy hàm của Microsoft C nhiều khi không chạy được.

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