Chuyên mục
Programming

Chuyển đổi từ số thực sang chuỗi kí tự trong C/C++

Như ta đã biết, trong C/C++ có tích hợp một số các hàm chuyển đổi cho phép ta chuyển đổi qua lại giữa các loại dữ liệu. Ví dụ các hàm atoi (chuyển chuỗi sang số nguyên), atof (chuyển sang float), atol (chuyển sang số longint), các hàm này có trong thư viện stdlib.h

Và ngược lại, từ số nguyên ta có thể chuyển đổi về chuỗi một cách dễ dàng dùng hàm itoa(). Ví dụ:

#include 	// for itoa() call
#include 	// for printf() call
int main() 
{
	int num = 123;
	char buf[5];
	// convert 123 to string [buf]
	itoa(num, buf, 10);
	// print our string
	printf("%sn", buf);
	return 0;
}

Lưu ý cần đảm bảo buf đủ chỗ chứa số cần chuyển để tránh trường hợp tràn bộ đệm, kích thước cỡ (sizeof(int)*8 + 1).

Chuyển đổi đối với số nguyên là như vậy nhưng đôi khi ta lại gặp trường hợp khó hơn là chuyển đổi float sang chuỗi vì trong thư viện của C/C++ không có hàm nào cho phép ta làm việc này. Thật may mắn, như các bạn biết trong câu lệnh printf() chúng ta khi in ra màn hình có thể ép kiểu các loại dữ liệu để cho ra kết quả đúng như ý muốn. Tương tự như vậy, chúng ta có thể sử dụng hàm sprintf() để chuyển đổi. Hàm này tương tự như hàm printf() nhưng thay vì in ra màn hình thì hàm này đưa vào trong bộ đệm để lưu trữ. Từ đó ta có thể dủng một chuỗi để chứa bộ đệm này. Cú pháp hàm này như sau: sprintf(string, “formatting string”, vars). Bây giờ hãy xét một ví dụ cụ thể:

#include 

int main()
{
   	float pi = 3.141596;
   	char halfpie[80];
   	pi/=2;

   	sprintf(halfpie, "%f", pi);
    printf("Here is the result: %sn", halfpie);
  	 return 0;
}

 

Tuy nhiên còn vấn đề ở đây!!

Hàm sprintf() tỏ ra không an toàn vì không có kiểm tra giới hạn của bộ đệm, và hoàn toàn bộ đệm có thể bị tràn và…..

Thay vì dùng hàm sprintf(), chúng ta sử dụng hàm snprintf() , trong đó n chính là giới hạn thông tin bạn đưa vào trong bộ đệm. Cú pháp: snprintf(string, size, “format string” , vars). Hàm snprintf() chỉ cho phép nạp size kí tự vào trong bộ nhớ. Ví dụ cụ thể:

#include 

int main()
{
   	float pi = 3.141596;
   	char halfpie[80];
   	pi/=2;

   	snprintf(halfpie, 79, "%f", pi);
    printf("Here is the result: %sn", halfpie);
  	 return 0;
}

Bây giờ thì bạn có thể yên tâm về hàm của mình. Lưu ý là trong hàm, tại nơi định dạng kí tự, ta có thể ép kiểu tùy theo tình huống cụ thể như dùng %f, %d, %e….

Bởi xuanchien

Tran Xuan Chien.

Japan Advanced Institute of Science and Technology - Japan.

Senior Developer - NUS Technology.

One reply on “Chuyển đổi từ số thực sang chuỗi kí tự trong C/C++”

Bình luận về bài viết này