[ C\C++ ] 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. 

Một số hàm thường dùng:
 - 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ụ [code C]:
#include <stdlib.h> // for itoa() call
#include <stdio.h> // 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 <stdio.h>
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à một số vấn đề khác,...

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 <stdio.h> 
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;
}

>>> Download Turbo C\C++ tại đây
Nguồn: Chienuit

2 nhận xét:

  1. ad ơi...thế làm sao chuyển từ 1 chuổi ký tự sang chuổi dạng 0110 vậy???
    ví dụ như có 1 chuổi ibuf: hello world làm sao chuyển sang thành 011001110000011010101?
    cảm ơn ạ !!!

    Trả lờiXóa
  2. cho mình hỏi code chuyển từ 1 đoạn ký tự sang dạng bit làm như thế nào vậy?
    vd có 1 chuổi a: hello world làm sao convert được chuổi a thành ví dụ 11000101000011100110111101?
    tks ạ !!

    Trả lờiXóa

Cảm ơn bạn đã quan tâm tới bài viết này!