C में स्ट्रिंग को इंट में कैसे कन्वर्ट करें?


225

आप int(पूर्णांक) को एक स्ट्रिंग में कैसे बदलेंगे? मैं एक ऐसा फंक्शन बनाने की कोशिश कर रहा हूं, structजो एक फाइल में सेव करने के लिए एक स्ट्रिंग के डेटा को कन्वर्ज करता है ।


3
printfया उसके एक चचेरे भाई को चाल करना चाहिए
pmg


1
आप इस एफएक्यू को क्रमांकन पर भी देख सकते हैं , और हो सकता है कि निम्नलिखित प्रश्न जो सी में क्रमबद्धता से संबंधित हों: (ए) , (बी) , (सी) अपने वास्तविक इरादे को प्राप्त करने के लिए।
मूविप

2
मेरा सामान्य पालतू शब्दार्थ यहाँ है। आप कुछ भी परिवर्तित नहीं करना चाहते हैं; आप एक स्ट्रिंग प्राप्त करना चाहते हैं (आधार 10?) के मूल्य का प्रतिनिधित्व int। हाँ मुझे पता है। यह एक बहुत ही सामान्य शॉर्ट कट है, लेकिन यह अभी भी मुझे परेशान करता है।
dmckee --- पूर्व-मध्यस्थ ने

जवाबों:


92

संपादित करें: जैसा कि टिप्पणी में कहा गया है, itoa()एक मानक नहीं है, इसलिए बेहतर उत्तर देने के लिए स्प्रिंटफ () दृष्टिकोण का उपयोग करें!


आप अपने पूर्णांक मान को स्ट्रिंग में बदलने के लिए itoa()फ़ंक्शन का उपयोग कर सकते हैं ।

यहाँ एक उदाहरण है:

int num = 321;
char snum[5];

// convert 123 to string [buf]
itoa(num, snum, 10);

// print our string
printf("%s\n", snum);

यदि आप अपनी संरचना को एक फ़ाइल में आउटपुट करना चाहते हैं, तो पहले से किसी भी मूल्य को परिवर्तित करने की कोई आवश्यकता नहीं है। आप अपने डेटा को आउटपुट करने के लिए प्रिंटफ प्रारूप विनिर्देश का उपयोग करके यह बता सकते हैं कि अपने मूल्यों को कैसे आउटपुट करें और प्रिंटफ़ परिवार के किसी भी ऑपरेटर का उपयोग करें।


29
itoaमानक नहीं है - उदाहरण के लिए देखें stackoverflow.com/questions/190229/…
Paul R

1
@PaRR अब मुझे नहीं पता था कि! स्पष्टीकरण के लिए धन्यवाद।
क्रिश्चियन राऊ

1
@PaRR धन्यवाद, मुझे नहीं पता था कि!
अलेक्जेंडर गल्किन

@SeanRamey यह itoa()उसी बफर अतिप्रवाह क्षमता के रूप में ग्रस्त है gets()
chux -

itoa C (C99 कम से कम) में उपलब्ध नहीं है। यह C ++
Motti Shneor

211

आप इसे करने के sprintfलिए उपयोग कर सकते हैं , या snprintfयदि आपके पास हो तो:

char str[ENOUGH];
sprintf(str, "%d", 42);

जहां वर्णों की संख्या (प्लस समाप्त करने वाले चार) का strउपयोग करके गणना की जा सकती है:

(int)((ceil(log10(num))+1)*sizeof(char))

9
यह सुनिश्चित करने के लिए कि ENOUGHहम यह कर सकते हैं पर्याप्त हैmalloc(sizeof(char)*(int)log10(num))
हौलेथ

2
@Hauleth या +2 भी, यह देखते हुए कि (int)log10(42)है 1
क्रिश्चियन राउ

23
या आप इसे संकलन-समय पर गणना कर सकते हैं:#define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)
कैफे

4
@hauleth फिर भी +2 के बजाय +1, यहां तक ​​कि छत के साथ भी: छत (लॉग (100)) = 2.0, न कि 3. अतः सटीक-शक्तियों के 10 के लिए, और शून्य को समाप्त करने के लिए एक और +1।
नहीं-बस-यति

24
आप माइनस साइन और लोकेल पर विचार नहीं करते हैं: हजारों विभाजक और समूहन। कृपया इसे इस तरह से करें: int length = snprintf(NULL, 0,"%d",42);लंबाई प्राप्त करने के लिए उपयोग करें, और फिर length+1स्ट्रिंग के लिए चार्ट आवंटित करें ।
user2622016

69

संक्षिप्त उत्तर है:

snprintf( str, size, "%d", x );

लंबा समय है: पहले आपको पर्याप्त आकार का पता लगाना होगा। snprintfयदि आप इसे NULL, 0पहले मापदंडों के रूप में कहते हैं तो लंबाई बताती है :

snprintf( NULL, 0, "%d", x );

अशक्त-टर्मिनेटर के लिए एक वर्ण अधिक आवंटित करें।

#include <stdio.h> 
#include <stdlib.h>

int x = -42;
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

यदि हर प्रारूप स्ट्रिंग के लिए काम करता है, तो आप फ्लोट या डबल का उपयोग करके स्ट्रिंग में "%g"परिवर्तित कर सकते हैं, आप int को हेक्स का उपयोग करके परिवर्तित कर सकते हैं "%x", और इसी तरह।


3
#include <stdio.h> #include <stdlib.h>
user1821961

@ user1821961 धन्यवाद, यह वास्तव में उल्लेख किया जाना चाहिए कि इन हेडर फ़ाइलों को शामिल करने की आवश्यकता है।
ब्यूक्सर

मुझे यह सबसे ज्यादा पसंद है, "सबसे मजबूत और" किताब से।
मोति श्नोर

30

गोक के लिए इटोआ के विभिन्न संस्करणों को देखने के बाद, सबसे अधिक लचीला संस्करण जो मैंने पाया है कि द्विआधारी, दशमलव और हेक्साडेसिमल के रूपांतरण को संभालने में सक्षम है, दोनों सकारात्मक और नकारात्मक http://www.strudel.org पर पाया गया चौथा संस्करण है .uk / इतोआ / । जबकि sprintf/ के snprintfफायदे हैं, वे दशमलव रूपांतरण के अलावा किसी भी चीज़ के लिए नकारात्मक संख्या को संभाल नहीं पाएंगे। चूंकि ऊपर लिंक या तो ऑफ लाइन है या अब सक्रिय नहीं है, मैंने नीचे उनका 4 वां संस्करण शामिल किया है:

/**
 * C++ version 0.4 char* style "itoa":
 * Written by Lukás Chmela
 * Released under GPLv3.
 */
char* itoa(int value, char* result, int base) {
    // check that the base if valid
    if (base < 2 || base > 36) { *result = '\0'; return result; }

    char* ptr = result, *ptr1 = result, tmp_char;
    int tmp_value;

    do {
        tmp_value = value;
        value /= base;
        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
    } while ( value );

    // Apply negative sign
    if (tmp_value < 0) *ptr++ = '-';
    *ptr-- = '\0';
    while(ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr--= *ptr1;
        *ptr1++ = tmp_char;
    }
    return result;
}

4
इसके अलावा, यह स्प्रिंट की तुलना में काफी तेज है। बड़ी फ़ाइलों को डंप करते समय महत्वपूर्ण हो सकता है।
यूजीन रियात्सेव

@ यूजीन रयब्त्सेव सी के प्रदर्शन की रेटिंग निर्दिष्ट नहीं करता है sprintf()और "यह स्प्रिंट से काफी तेज है" आपके कंपाइलर पर सही हो सकता है लेकिन हमेशा पकड़ में नहीं आता। एक कंपाइलर देखने sprintf(str, "%d", 42);और इसे अनुकूलित करने के लिए itoa()फ़ंक्शन की तरह अनुकूलित कर सकता है - निश्चित रूप से इस उपयोगकर्ता की तुलना में तेज़। कोड।
chux -

3
@chux हाँ, एक कंपाइलर sprintf(str, "%d", 42);दो कॉन्स्टेंट चार्ट को अपग्रेड करने के रूप में अनुकूलित कर सकता है , लेकिन यह सिद्धांत है। व्यवहार में लोग कॉन्स्टेंट को नहीं छिड़कते हैं और ऊपर दिया गया यह लगभग उतना ही अनुकूलित होता है जितना इसे प्राप्त होता है। कम से कम आप 100% सुनिश्चित हो सकते हैं कि आपको एक सामान्य स्प्रिंटफ के परिमाण के आदेश नहीं मिलेंगे। संकलक संस्करण और सेटिंग्स के साथ, जो भी आपके मन में है, उसे देखना अच्छा होगा।
यूजीन रयबत्सेव

1
@chux यदि यह एक कॉल में समाप्त होता है, तो यह बहुत अधिक व्याख्या नहीं करता है जब तक कि हम नियमित दिनचर्या की तुलना ऊपर की दिनचर्या से नहीं करते हैं (सभी तरह से अधिक कॉल करने के लिए नीचे, विधानसभा में, यदि आपको पसंद है)। यदि आप इसे संकलक संस्करण और सेटिंग्स के साथ एक उत्तर के रूप में करते हैं, तो मैं इसे उपयोगी के रूप में बढ़ा दूंगा।
यूजीन रयबत्सेव

2
आउटपुट लंबाई वापस पाने का एक तरीका प्रदान करना अच्छा होगा। मैंने यहां ऐसा किया है: stackoverflow.com/a/52111436/895245 + इकाई परीक्षण।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '' ''

9

यह पुराना है लेकिन यहां एक और तरीका है।

#include <stdio.h>

#define atoa(x) #x

int main(int argc, char *argv[])
{
    char *string = atoa(1234567890);
    printf("%s\n", string);
    return 0;
}

32
केवल स्थिरांक के लिए काम करता है, चर के लिए नहीं।
नाकेबल 22

7

यदि आप GCC का उपयोग कर रहे हैं, तो आप GNU एक्सटेंशन asprintf फ़ंक्शन का उपयोग कर सकते हैं।

char* str;
asprintf (&str, "%i", 12313);
free(str);

7

किसी भी चीज को स्ट्रिंग में परिवर्तित करना चाहिए 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

अरे चक्स, क्या तुम्हें पता है कि ग्लिबक आंतरिक कार्यान्वयन को उजागर करने का कोई तरीका है? sourceware.org/git/?p=glibc.git/a=blob;f=stdio-common/…
Ciro Santilli 郝海东 / / 事件 法轮功

1
@CiroSantilli 新疆 改造 ill ill ill am मैं glibc आंतरिक कार्यान्वयन से परिचित नहीं हूँ।
chux -

3
/*Function return size of string and convert signed  *
 *integer to ascii value and store them in array of  *
 *character with NULL at the end of the array        */

int itoa(int value,char *ptr)
     {
        int count=0,temp;
        if(ptr==NULL)
            return 0;   
        if(value==0)
        {   
            *ptr='0';
            return 1;
        }

        if(value<0)
        {
            value*=(-1);    
            *ptr++='-';
            count++;
        }
        for(temp=value;temp>0;temp/=10,ptr++);
        *ptr='\0';
        for(temp=value;temp>0;temp/=10)
        {
            *--ptr=temp%10+'0';
            count++;
        }
        return count;
     }

2

यदि आप अपनी संरचना को एक फ़ाइल में आउटपुट करना चाहते हैं, तो पहले से किसी भी मूल्य को परिवर्तित करने की कोई आवश्यकता नहीं है। आप अपने डेटा को आउटपुट करने के लिए प्रिंटफ प्रारूप विनिर्देश का उपयोग करके यह बता सकते हैं कि अपने मूल्यों का उत्पादन कैसे करें और प्रिंटफ़ परिवार के किसी भी ऑपरेटर का उपयोग कैसे करें।


-2

पूर्णांक को स्ट्रिंग मेंitoa() बदलने के लिए फ़ंक्शन का उपयोग करें

उदाहरण के लिए:

char msg[30];
int num = 10;
itoa(num,msg,10);

पहले से ही @AlexanderGalkin द्वारा जवाब दिया गया: stackoverflow.com/a/8257754/6872717
Cacahuete Frito
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.