किसी भी चीज को स्ट्रिंग में परिवर्तित करना चाहिए 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+3
char
एक वैकल्पिक नकारात्मक चिह्न, अंक और एक अशक्त चरित्र से युक्त स्ट्रिंग के रूप में कुछ हस्ताक्षरित पूर्णांक प्रकार को एन्कोड करने के लिए कम से कम अधिकतम की आवश्यकता होती है ।।
एक हस्ताक्षरित पूर्णांक में गैर-साइन बिट्स की संख्या से अधिक नहीं है 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
या उसके एक चचेरे भाई को चाल करना चाहिए