Thắc mắc về cấp phát động

Mọi người cho em hỏi: em viết chương trình sau đơn giản chỉ để nhập vào một xâu và xuất ra lại, tuy nhiên em không muốn cấp phát tĩnh mà muốn cấp phát động, cho người dùng nhập thoải mái, nhập tới đâu thì chương trình cấp phát tới đó. Nhưng khi nhập xong thì xuất không được, lạ hơn là nếu thay hàm puts bằng printf với %s thì lại được, và nếu tách việc nhập đó ra một hàm riêng thì cả puts và printf đều không xuất được
Em mới học lập trình nên còn non nớt, mong mọi người chỉ em lỗi sai và nếu có thể thì hướng dẫn cho em cách khắc phục hoặc một ý tưởng khác
Chương trình của em đây:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

int main(void)
{
	char *p;
	char c;
	int i=0;
	p=(char*)malloc(sizeof(char));
	while(1)
        {
		c=getche();
		if(c>=32 && c<=126)     //c là chữ cái, số hoặc dấu cách
                {          
			i++;
			p=(char*)realloc(p,(i+1)*sizeof(char));
			*(p+i-1)=c;
			*(p+i)='\0';
		}
		else 
			if(c==10 || c==13)       //em chả biết enter là 10 hay 13
				break;
			else
				printf("\b \b");        //phòng khi người dùng nhập các phím khác
	}
	puts(p);
	getch();
	return 0;
}

Bạn dùng cấp phát động theo cách tăng theo lượng nhập là tốt, nhưng đừng nên mỗi lần thêm 1 phần tử là lại cấp phát lại.

Bạn nên cấp phát ban đầu là 1 lượng nhất định sau đó tăng lên cũng theo 1 lượng (hoặc công thức nào đó).
VD: Cấp ban đầu là 4 phần tử, sau mỗi lần số phần tử tới hạn thì nhân đôi lên. Theo cơ số 2. 4 -> 8 -> 16 -> 32 -> 46…
Cũng có thể là 10 -> 100 -> 1000… Cơ số 10.
Hoặc cũng có thể là số tăng cố định: 10 -> 20 -> 30 -> 40… Tăng 10.
Đừng nên cấp phát 1 cách lắt nhắt như vậy.

Mình chưa rõ nguyên nhân gây ra.
Bạn có thể cho xem đoạn tách ra hàm riêng được không?

1 Like

Không thấy có lỗi sai gì trong code của bạn. Bạn có thể post ảnh output của bạn lên không?

có thể liên quan tới variable scope. Post code tách lên xem thử.

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