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);
}
Bài liên quan
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ặpbỏ dòng
free(xau);
thì nó vẫn lỗi bạn ơibỏ & đ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.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)
là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õ!
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