Tại sao sau khi nhập Y thì chương trình bị stop working?

Cho em hỏi là sao khi chương trình chạy xong em nhập Y thì nó bị stop working ạ???

#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
void changes(char ch[]);
int main()
{
	char check;
  	do
	{
        char *xau=malloc(sizeof(char));
		printf("Nhap vao mot chuoi: ");
		gets(xau);
		changes(xau);
		free(xau);
		printf("Ban co muon lam lai khong? [Y/N]\n");
		scanf("%c",&check);
	} while(check=='Y'||check=='y');
	return 0;
} 
void changes(char *ch)
{
	ch[0]= toupper(ch[0]);
	int i;
	for (i=1;i<strlen(ch)-1;i++)
	{
		if (ch[i]!=' ')
		ch[i+1]=tolower(ch[i+1]);
		else ch[i+1]=toupper(ch[i+1]);
	}
	puts(ch);
}

Do cái dòng free(xau); của bạn đó, nên nhớ nếu free rồi thì không thể sử dụng lao được nữa, trong khi đó bạn lại đi dùng lại biến đó trong vòng lặp

1 Like

bỏ dòng free(xau); thì nó vẫn lỗi bạn ơi

bỏ & đi thử xem thế nào

bỏ & mà nó vẫn bị =(((((

Bạn chỉ cấp phát 1 ký tự thì crash là phải. Hàm gets cũng không an toàn tí nào. Mình build thử thì nó crash sau khi free chứ chưa tới nhập Y.

char *xau=malloc(sizeof(char));

Vậy nên sửa thế nào bạn nhỉ?

Thứ nhất, mình đã chỉ lỗi, bạn nên tìm cách sửa thì tốt hơn. Quản lý bộ nhớ là đề tài gây lỗi muôn thuở, mình không thể cầm tay chỉ việc hết cho bạn được.
Thứ hai, thay vì cấp phát 1 ký tự (1 char = 1 byte) thì cấp phát đại 100 ký tự và dùng char *fgets(char *, int, FILE *);. Hoặc tốt hơn thì tự viết lại hàm nhập chuỗi.
Hàm fgets ở trên được viết lại cho số byte được cấp phát trước đó:
char *xau = (char *) malloc(sizeof(char) * 100)fgets(xau, 100, stdin)

Bạn có thể dùng tính năng search để tìm hiểu hàm này. Mình lười gõ!

2 Likes

Cảm ơn bạn, sau khi gõ hỏi bạn sửa thế nào mình cũng đã tự tìm hiểu và sửa được rồi. bạn reply hơi gắt nhưng mình thích :3

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