30/09/2018, 16:15

Cách cấp phát bộ nhớ động để làm việc với chuỗi ký tự?

  • Theo như cách cấp phát bộ nhớ thì ví dụ đối với mảng số nguyên, cấp phát cho n phần tử
    int *mang = (int )malloc(nsizeof(int));
  • Bây giờ muốn sử dụng con trỏ và cấp phát bộ nhớ để nhập chuỗi bất kỳ thì phải làm như
    thế nào, mình làm như sau là đúng hay sai?
    char *chuoi = (char *)malloc(sizeof(char));
Phạm Hoàng Tuấn viết 18:19 ngày 30/09/2018

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

Mình ngĩ nên với dòng trên thì chỉ cấp phát dc cho 1 ký tự, nên để là :
char *chuoi = (char *)malloc(lengh* sizeof(char)); với lengh là số ký tự tối đa đươc phép nhập.Tương tự như cấp phát số nguyên ở trên có n là số lượng phẩn tử ấy

Nguyễn Minh Dũng viết 18:18 ngày 30/09/2018

int mang = (int *)malloc(nsizeof(int));

Em viết thế này là sai rồi Điền ơi. Phải là

int * mang = (int *) malloc (n * sizeof(int));

Còn về chuỗi thì Tuấn trả lời ở trên là đúng rồi đấy

Nguyễn Hữu Điền viết 18:22 ngày 30/09/2018

Chết thật e viết thiếu đấy chứ lúc làm bài thì cú pháp đúng @ltd

Nguyễn Hữu Điền viết 18:23 ngày 30/09/2018

Hai anh @ltd @tuancoi2506 xem giúp e đoạn code này, e hiểu biến lengh rồi, bài của e tương đương đó là DoDaiChuoi. Nhưng để có được giá trị của biến lengh thì mình phải có thao tác khai báo Chuoi[50] và trả về độ dài chuỗi bằng hàm strlen(). Như vậy e muốn hỏi là lúc này bộ nhớ luôn cấp phát 50 ô nhớ trong bộ nhớ để lưu chuỗi, thế thì vẫn tốn bộ nhớ. Câu hỏi chính xác của e lúc này là: Nhập vào một chuỗi và lưu vào một biến con trỏ
Em làm như trong đoạn code có đúng không ạ???
http://codepad.org/d4dQ8EdI

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char Chuoi[100];
	printf("Nhap chuoi:");
	gets(Chuoi);
	int DoDaiChuoi = strlen(Chuoi);// Tinh do dai chuoi vua nhap
	char *str = (char *)malloc(DoDaiChuoi*sizeof(char));// Cap phat bo nho cho con tro cos the luu duoc toi da DoDaiChuoi
	//Gan chuoi sang con tro str kieu char, hay noi cach khac la luu chuoi vua nhap vao bien con tro str kieu char
	for(int i = 0; i < DoDaiChuoi ; i++)
	{
		*(str + i) = Chuoi[i];
	}
	
	printf("In chuoi bang mang(In tung phan tu): ");
	for(int i = 0; i < DoDaiChuoi ; i++)
	{
		printf("%c",Chuoi[i]);
	}
	
	printf("\n\nIn chuoi bang con tro(In tung phan tu): ");
	for(int i = 0; i < DoDaiChuoi ; i++)
	{
		printf("%c",*(str + i));
	}
	getch();
	return 0;
}
Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

Bài của em không biết trước độ dài của chuỗi và chỉ biết khi nào mình nhập chuỗi vào mà thôi. Thì anh có gợi ý cho em thế này.

Em có thể đọc từng ký tự trong chuỗi bằng hàm getchar(). Sau đó em sẽ dùng hàm realloc để thay đổi vùng nhớ của chuỗi. Anh viết code như sau:

Trong đó anh khởi tạo giá trị đầu tiên của chuỗi là 10, sau đó anh tăng giá trị lên cho đủ.

#include <stdio.h>

#define INIT_SIZE 10
int main()
{
    char c;
    int current_size = INIT_SIZE;
    char * str = (char*)malloc(INIT_SIZE * sizeof(char));
    int i = 0;
    while ((c = getchar()) != '\n')
    {
        if ( i == current_size - 1)
        {
            current_size *= 2;
            str = (char*)realloc(str, current_size);
            if (str)
            {
                printf("kich thuoc mang da het, kich thuoc moi la %d\n", current_size);
            }
            else
            {
                printf("bo nho khong du\n");
                exit(1);
            }
        }
        str[i++] = c;
    }
    str[i] = 0;
    printf("Mang vua nhap vao la: %s", str);

    return 0;
}
Lê Anh Tuấn viết 18:22 ngày 30/09/2018

Cách này như vậy là tối ưu nhất rồi phải không a Đạt? Cho em hỏi bình thường mình quản lí bộ nhớ như thế nào với chuỗi ạ? Tại vì em mới học về con trỏ, em thấy khó quản lí kí tự nhập vào quá.

Bài liên quan
0