ฟังก์ชัน itoa ใน Linux อยู่ที่ไหน
เนื่องจากitoa()
ไม่ใช่มาตรฐานใน C เวอร์ชันต่าง ๆ ที่มีลายเซ็นของฟังก์ชันต่าง ๆ จะมีอยู่
char *itoa(int value, char *str, int base);
เป็นเรื่องปกติใน * ระวัง
หากมันหายไปจาก Linux หรือหากรหัสไม่ต้องการ จำกัด การพกพารหัสอาจทำให้มันเป็นของตัวเอง
ด้านล่างนี้เป็นรุ่นที่ไม่ได้มีปัญหากับINT_MIN
และบัฟเฟอร์ปัญหาจับ: หรือผลตอบแทนบัฟเฟอร์ไม่เพียงพอNULL
NULL
#include <stdlib.h>
#include <limits.h>
#include <string.h>
// Buffer sized for a decimal string of a `signed int`, 28/93 > log10(2)
#define SIGNED_PRINT_SIZE(object) ((sizeof(object) * CHAR_BIT - 1)* 28 / 93 + 3)
char *itoa_x(int number, char *dest, size_t dest_size) {
if (dest == NULL) {
return NULL;
}
char buf[SIGNED_PRINT_SIZE(number)];
char *p = &buf[sizeof buf - 1];
// Work with negative absolute value
int neg_num = number < 0 ? number : -number;
// Form string
*p = '\0';
do {
*--p = (char) ('0' - neg_num % 10);
neg_num /= 10;
} while (neg_num);
if (number < 0) {
*--p = '-';
}
// Copy string
size_t src_size = (size_t) (&buf[sizeof buf] - p);
if (src_size > dest_size) {
// Not enough room
return NULL;
}
return memcpy(dest, p, src_size);
}
ด้านล่างเป็นรุ่น C99 หรือใหม่กว่าที่รองรับฐาน [2 ... 36]
char *itoa_x(int number, char *dest, size_t dest_size, int base) {
if (dest == NULL || base < 2 || base > 36) {
return NULL;
}
char buf[sizeof number * CHAR_BIT + 2]; // worst case: itoa(INT_MIN,,,2)
char *p = &buf[sizeof buf - 1];
// Work with negative absolute value to avoid UB of `abs(INT_MIN)`
int neg_num = number < 0 ? number : -number;
// Form string
*p = '\0';
do {
*--p = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[-(neg_num % base)];
neg_num /= base;
} while (neg_num);
if (number < 0) {
*--p = '-';
}
// Copy string
size_t src_size = (size_t) (&buf[sizeof buf] - p);
if (src_size > dest_size) {
// Not enough room
return NULL;
}
return memcpy(dest, p, src_size);
}
สำหรับ C89 และรหัสที่เป็นไปตามมาตรฐานให้แทนที่ลูปด้านในด้วย
div_t qr;
do {
qr = div(neg_num, base);
*--p = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[-qr.rem];
neg_num = qr.quot;
} while (neg_num);
sprintf(str, "%d", num)
? มันช้ากว่าitoa
ไหม