atoi() फंक्शन
स्टैंडर्ड लाइब्रेरी फंक्शन atoi() (stdlib.h) स्ट्रिंग को पूर्णांक में बदलता है।
- केवल अग्रणी संख्यात्मक भाग बदलता है
- गैर-संख्यात्मक वर्ण मिलने पर रुक जाता है
- अमान्य इनपुट पर 0 लौटाता है (कोई त्रुटि संकेत नहीं)
- ओवरफ्लो व्यवहार अनिर्धारित
कस्टम atoi() क्यों बनाएं?
- त्रुटि पहचान (सफलता/विफलता जानना)
- ओवरफ्लो जांच
- सीखने/साक्षात्कार के लिए एल्गोरिदम समझ
- अतिरिक्त सुविधाएँ: आधार (base) समर्थन, व्हाइटस्पेस हैंडलिंग
एल्गोरिदम
- अग्रणी व्हाइटस्पेस छोड़ें
- चिह्न (+/-) जांचें
- प्रत्येक अंक के लिए:
result = result * 10 + (ch - '0') - गैर-अंक मिलने पर रुकें
- चिह्न लागू करें
- ओवरफ्लो जांचें
स्टैंडर्ड atoi() उदाहरण
#include <stdio.h>
#include <stdlib.h>
int main() {
char *s1 = "3567";
char *s2 = "TutorialsPoint";
char *s3 = " -123abc";
printf("'%s' → %d\n", s1, atoi(s1)); // 3567
printf("'%s' → %d\n", s2, atoi(s2)); // 0
printf("'%s' → %d\n", s3, atoi(s3)); // -123
return 0;
}
कस्टम कार्यान्वयन (मजबूत संस्करण)
#include <stdio.h>
#include <limits.h> // INT_MAX, INT_MIN
#include <ctype.h> // isspace, isdigit
// रिटर्न: सफलता पर 0, विफलता पर -1
// परिणाम *out में संग्रहीत
int my_atoi(const char *str, int *out) {
if (!str || !out) return -1;
// 1. व्हाइटस्पेस छोड़ें
while (isspace(*str)) str++;
// 2. चिह्न
int sign = 1;
if (*str == '+') str++;
else if (*str == '-') { sign = -1; str++; }
// 3. अंक पढ़ें
long long result = 0; // ओवरफ्लो जांच के लिए बड़ा प्रकार
int digits = 0;
while (isdigit(*str)) {
int digit = *str - '0';
result = result * 10 + digit;
digits++;
str++;
// 4. ओवरफ्लो जांच
if (sign == 1 && result > INT_MAX) return -1;
if (sign == -1 && -result < INT_MIN) return -1;
}
// 5. कोई अंक नहीं मिला
if (digits == 0) return -1;
*out = (int)(sign * result);
return 0;
}
int main() {
char *tests[] = {"3567", "TutorialsPoint", " -123abc", "+42", "", "2147483647", "2147483648", NULL};
for (int i = 0; tests[i]; i++) {
int val;
int ret = my_atoi(tests[i], &val);
if (ret == 0)
printf("'%s' → %d ✓\n", tests[i], val);
else
printf("'%s' → अमान्य/ओवरफ्लो ✗\n", tests[i]);
}
return 0;
}
आउटपुट
'3567' → 3567 ✓ 'TutorialsPoint' → अमान्य/ओवरफ्लो ✗ ' -123abc' → -123 ✓ '+42' → 42 ✓ '' → अमान्य/ओवरफ्लो ✗ '2147483647' → 2147483647 ✓ '2147483648' → अमान्य/ओवरफ्लो ✗
उन्नत: strtol() उपयोग करें (अनुशंसित)
वास्तविक कोड में strtol() उपयोग करें - यह मजबूत, मानक और आधार (base 2-36) समर्थन करता है।
#include <stdlib.h>
#include <errno.h>
long val = strtol(str, &endptr, 10);
if (endptr == str) { /* कोई अंक नहीं */ }
if (errno == ERANGE) { /* ओवरफ्लो */ }
तुलना
| फंक्शन | रिटर्न | त्रुटि जांच | आधार | सिफारिश |
|---|---|---|---|---|
atoi() | int | नहीं | 10 | सरल उपयोग, कोई त्रुटि जांच नहीं |
strtol() | long | हाँ (endptr, errno) | 2-36 | अनुशंसित |
strtoll() | long long | हाँ | 2-36 | 64-बिट के लिए |
| कस्टम | int/bool | डिजाइन अनुसार | डिजाइन अनुसार | सीखने/विशेष आवश्यकता |