যে কোনও কিছুকে স্ট্রিংয়ে রূপান্তর করা উচিত 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;
}
@ অল্টার মন দ্বারা অনুরোধ হিসাবে [সম্পাদনা করুন]
(CHAR_BIT*sizeof(int_type)-1)*10/33+3
char
signedচ্ছিক নেতিবাচক চিহ্ন, অঙ্কগুলি এবং একটি নাল অক্ষর সমন্বিত স্ট্রিং হিসাবে কিছু স্বাক্ষরিত পূর্ণসংখ্যার টাইপটিকে এনকোড করার জন্য কমপক্ষে প্রয়োজনীয় সংখ্যার প্রয়োজন হয় ..
একটি স্বাক্ষরিত পূর্ণসংখ্যায় স্বাক্ষরবিহীন বিটের সংখ্যা আর বেশি নয় 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
বা এর চাচাত ভাইয়ের