Bird
0
0
DSA Cprogramming

String to Integer atoi in DSA C

Choose your learning style9 modes available
Mental Model
Convert each character digit in the string to a number and build the integer step by step.
Analogy: Like reading a number on a sign one digit at a time and writing it down to form the full number.
Input string: "  -42abc"
Positions:  [0] [1] [2] [3] [4] [5] [6]
Characters: ' '  '-'  '4'  '2'  'a'  'b'  'c'

Integer building:
result = 0
result = result * 10 + digit

Pointer ↑ at start of string
Dry Run Walkthrough
Input: string: " -42abc"
Goal: Convert the string to integer -42, ignoring trailing non-digit characters
Step 1: Skip leading spaces
Pointer ↑ at '-' (index 2), string: "  -42abc"
Why: Spaces do not affect the number, so we ignore them
Step 2: Check sign character '-' and set sign = -1
Pointer ↑ at '4' (index 3), sign = -1
Why: Minus sign means the number is negative
Step 3: Convert '4' to digit 4 and update result = 0 * 10 + 4 = 4
result = 4, pointer ↑ at '2' (index 4)
Why: First digit of the number
Step 4: Convert '2' to digit 2 and update result = 4 * 10 + 2 = 42
result = 42, pointer ↑ at 'a' (index 5)
Why: Second digit of the number
Step 5: Encounter non-digit 'a', stop parsing
result = 42, pointer at 'a' (index 5)
Why: Non-digit means number ends here
Step 6: Apply sign to result: result = -1 * 42 = -42
final result = -42
Why: Sign affects the final integer value
Result:
final integer = -42
Annotated Code
DSA C
#include <stdio.h>
#include <limits.h>

int myAtoi(const char *str) {
    int i = 0;
    int sign = 1;
    long result = 0;

    // Skip leading spaces
    while (str[i] == ' ') {
        i++;
    }

    // Check sign
    if (str[i] == '-' || str[i] == '+') {
        sign = (str[i] == '-') ? -1 : 1;
        i++;
    }

    // Convert digits to integer
    while (str[i] >= '0' && str[i] <= '9') {
        result = result * 10 + (str[i] - '0');

        // Check overflow
        if (sign == 1 && result > INT_MAX) {
            return INT_MAX;
        }
        if (sign == -1 && -result < INT_MIN) {
            return INT_MIN;
        }
        i++;
    }

    return (int)(sign * result);
}

int main() {
    const char *input = "  -42abc";
    int output = myAtoi(input);
    printf("%d\n", output);
    return 0;
}
while (str[i] == ' ') { i++; }
skip all spaces before number
if (str[i] == '-' || str[i] == '+') { sign = (str[i] == '-') ? -1 : 1; i++; }
detect and record sign, move pointer forward
while (str[i] >= '0' && str[i] <= '9') {
process each digit character
result = result * 10 + (str[i] - '0');
build integer by shifting digits left and adding new digit
if (sign == 1 && result > INT_MAX) { return INT_MAX; }
handle positive overflow by clamping
if (sign == -1 && -result < INT_MIN) { return INT_MIN; }
handle negative overflow by clamping
return (int)(sign * result);
apply sign and return final integer
OutputSuccess
-42
Complexity Analysis
Time: O(n) because we scan the string once until non-digit or end
Space: O(1) because we use fixed variables, no extra data structures
vs Alternative: Compared to using built-in functions, this manual parsing avoids overhead and allows custom overflow handling
Edge Cases
empty string
returns 0 because no digits found
DSA C
while (str[i] >= '0' && str[i] <= '9') {
string with only spaces
returns 0 after skipping spaces and finding no digits
DSA C
while (str[i] == ' ') { i++; }
string with number exceeding int max
returns INT_MAX to avoid overflow
DSA C
if (sign == 1 && result > INT_MAX) { return INT_MAX; }
string with number below int min
returns INT_MIN to avoid overflow
DSA C
if (sign == -1 && -result < INT_MIN) { return INT_MIN; }
string with no digits after sign
returns 0 because no digits parsed
DSA C
while (str[i] >= '0' && str[i] <= '9') {
When to Use This Pattern
When you see a problem asking to convert a string to an integer with possible spaces and signs, use the atoi pattern to parse character by character and handle edge cases.
Common Mistakes
Mistake: Not skipping leading spaces before parsing digits
Fix: Add a loop to skip spaces before checking sign or digits
Mistake: Not handling sign character correctly
Fix: Check for '+' or '-' and set sign variable accordingly before parsing digits
Mistake: Not stopping parsing at first non-digit character
Fix: Stop the digit parsing loop when a non-digit is encountered
Mistake: Ignoring integer overflow and underflow
Fix: Check if result exceeds INT_MAX or INT_MIN and clamp accordingly
Summary
Converts a string to an integer by reading digits and applying sign.
Use when you need to parse numbers from strings with spaces and signs.
The key is to process characters one by one, handle sign, and stop at first non-digit.