Viết hàm chuyển đổi một số nguyên thành chuỗi kí tự biểu diễn thập phân của nó

Chào mọi người, em là sv năm nhất chuẩn bị thi cuối kì. Trong lúc xem lại các đề năm trước thì có gặp câu này loay hoay mãi mà k được. Đề bài như trong tiêu đề, mong được nhận sự giúp đỡ ạ.
Còn cái này là code lỗi của em.

#include <stdio.h>
#include <string.h>
int luythua10(int n)
{
	if (n == 1) return 10;
	else return 10 * luythua10(n - 1);
}
char* chu(int &so)
{
	char kq[10];
	int dem=0;
	if (so < 0)
	{
		strcat(kq, "-");
		so = -so;
	}
	for (int i = so; i > 0; i=i/10)
		dem++;
	for (int i = dem - 1; i >= 1; i--)
	{
		int a = so / luythua10(i);
		char c[1];
		c[0]=(char)(a + 48);
		strcat(kq, c);
		so = so - a*luythua10(i);
	}
	return kq;
}
void main()
{
	int a;
	scanf("%d",&a);
	puts(chu(a));
}
1 Like

Nếu bạn dùng được mảng thì nên viết do { s[i++] = n % 10; /* ... */ } while (n >= 10); :smiley:

Nên đặt trực tiếp không qua abstraction (vì nó cực kì mỏng).

1 Like

hic mình k hiểu :frowning:

Giải thích code

Mình sửa lại và thêm comment code của bạn, code đã chạy được nha :sunny:

  • Mình thực hiện đếm số chữ số trước
    Sau đó xin cấp phát ô nhớ cho chuỗi kết quả
    ->Tiết kiệm ô nhớ hơn

  • Mình không sử dụng hàm strcat
    Thay vào đó mình dùng phép gán =
    Gán các ký tự vào vị trí đúng của chúng
    Ví dụ -13 : kq[0] = '-'; kq[1] = '1'; kq[2] = '3'; kq[3] = '\0';

Code

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Function to convert interger to string (num2str)
char* num2str(int num)
{
    // Biến count chứa số chữ số của biến num
	int count = 0; 
    // Đếm số chữ số của biến num
    for (int i = abs(num); i > 0; i=i/10) count++;
    // Cấp phát 1 chuỗi có count ký tự
    // Xin cấp phát dư 2 ô nhớ 
    // Để chứa ký tự '+' hoặc '-'
    // Và ký tự kết thúc chuỗi '\0'
	char *ret = (char*) malloc(sizeof(char)*(count + 2));
    // Nếu là số dương chèn ký tự '+' vào đầu chuỗi kết quả
	if (num >= 0) ret[0] = '+';
    // Nếu là số âm chèn ký tự '-' vào đầu chuỗi kết quả
    // Đảo dấu biến num
    else {
        ret[0] = '-';
        num = num*(-1);
    }
    // Chèn ký tự kết thúc chuỗi '\0'
    ret[count + 1] = '\0';
    // Lập count lần chèn từng ký tự vào chuỗi kết quả
	for (int i = 1; i <= count; ++i)
	{
        // Lấy số đầu tiên(ngoài cùng bên tay trái)
		int a = num / pow(10, count - i);
        // Gán vào chuỗi
		ret[i] = (char)(a + 48);
        // Xóa số đầu tiên(ngoài cùng bên tay trái)
		num = num - a*pow(10, count - i);
	}
    // Trả về kết quả
	return ret;
}
int main()
{
    // Nhập số int
	int a; scanf("%d",&a);
    // In số int khi chuyển sang string
	printf("%s", num2str(a));
    return 0;
}
2 Likes

mình hiểu rồi, cám ơn bạn nhiều nhé :smile:

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