01/10/2018, 15:24

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]
");
		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);
}
Quân viết 17:33 ngày 01/10/2018

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

An Nguyễn Đăng viết 17:26 ngày 01/10/2018

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

Nguyễn Phú Thành viết 17:30 ngày 01/10/2018

gets(&xau);
changes(&xau);

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

An Nguyễn Đăng viết 17:28 ngày 01/10/2018

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

Khoa NTA viết 17:24 ngày 01/10/2018

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));
An Nguyễn Đăng viết 17:37 ngày 01/10/2018

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

Khoa NTA viết 17:39 ngày 01/10/2018

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õ!

An Nguyễn Đăng viết 17:37 ngày 01/10/2018

char *xau = (char *) malloc(sizeof(char) * 100) là fgets(xau, 100, stdin)

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

Bài liên quan
0