किसी भी चीज को स्ट्रिंग में परिवर्तित करना चाहिए 1) परिणामी स्ट्रिंग को आवंटित करें या 2) एक char *गंतव्य और आकार में पास करें। नीचे नमूना कोड:
दोनों intसहित सभी के लिए काम करते हैं INT_MIN। वे इसके विपरीत एक सुसंगत आउटपुट प्रदान करते हैं snprintf()जो वर्तमान स्थान पर निर्भर करता है।
विधि 1: NULLस्मृति से बाहर है।
#define INT_DECIMAL_STRING_SIZE(int_type) ((CHAR_BIT*sizeof(int_type)-1)*10/33+3)
char *int_to_string_alloc(int x) {
int i = x;
char buf[INT_DECIMAL_STRING_SIZE(int)];
char *p = &buf[sizeof buf - 1];
*p = '\0';
if (i >= 0) {
i = -i;
}
do {
p--;
*p = (char) ('0' - i % 10);
i /= 10;
} while (i);
if (x < 0) {
p--;
*p = '-';
}
size_t len = (size_t) (&buf[sizeof buf] - p);
char *s = malloc(len);
if (s) {
memcpy(s, p, len);
}
return s;
}
विधि 2: NULLयदि बफर बहुत छोटा था, तो यह वापस आ जाता है ।
static char *int_to_string_helper(char *dest, size_t n, int x) {
if (n == 0) {
return NULL;
}
if (x <= -10) {
dest = int_to_string_helper(dest, n - 1, x / 10);
if (dest == NULL) return NULL;
}
*dest = (char) ('0' - x % 10);
return dest + 1;
}
char *int_to_string(char *dest, size_t n, int x) {
char *p = dest;
if (n == 0) {
return NULL;
}
n--;
if (x < 0) {
if (n == 0) return NULL;
n--;
*p++ = '-';
} else {
x = -x;
}
p = int_to_string_helper(p, n, x);
if (p == NULL) return NULL;
*p = 0;
return dest;
}
[संपादित करें @Alter मान द्वारा अनुरोध के रूप में
(CHAR_BIT*sizeof(int_type)-1)*10/33+3charएक वैकल्पिक नकारात्मक चिह्न, अंक और एक अशक्त चरित्र से युक्त स्ट्रिंग के रूप में कुछ हस्ताक्षरित पूर्णांक प्रकार को एन्कोड करने के लिए कम से कम अधिकतम की आवश्यकता होती है ।।
एक हस्ताक्षरित पूर्णांक में गैर-साइन बिट्स की संख्या से अधिक नहीं है CHAR_BIT*sizeof(int_type)-1। एक n-बिट-बाइनरी संख्या का आधार -10 प्रतिनिधित्व n*log10(2) + 1अंकों तक ले जाता है । 10/33से थोड़ा अधिक है log10(2)। हस्ताक्षर के charलिए +1 और अशक्त चरित्र के लिए +1। अन्य अंशों का उपयोग 28/93 की तरह किया जा सकता है।
विधि 3: यदि कोई किनारे पर रहना चाहता है और बफर अतिप्रवाह एक चिंता का विषय नहीं है, तो एक सरल C99 या बाद का समाधान इस प्रकार है जो सभी को संभालता है int।
#include <limits.h>
#include <stdio.h>
static char *itoa_simple_helper(char *dest, int i) {
if (i <= -10) {
dest = itoa_simple_helper(dest, i/10);
}
*dest++ = '0' - i%10;
return dest;
}
char *itoa_simple(char *dest, int i) {
char *s = dest;
if (i < 0) {
*s++ = '-';
} else {
i = -i;
}
*itoa_simple_helper(s, i) = '\0';
return dest;
}
int main() {
char s[100];
puts(itoa_simple(s, 0));
puts(itoa_simple(s, 1));
puts(itoa_simple(s, -1));
puts(itoa_simple(s, 12345));
puts(itoa_simple(s, INT_MAX-1));
puts(itoa_simple(s, INT_MAX));
puts(itoa_simple(s, INT_MIN+1));
puts(itoa_simple(s, INT_MIN));
}
नमूना उत्पादन
0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648
printfया उसके एक चचेरे भाई को चाल करना चाहिए