📖 Scenario: You are writing a simple C program that takes a number as a command-line argument and processes it.This is common when programs need input values from the user when starting.
🎯 Goal: Build a C program that reads a numeric argument from the command line, converts it to an integer, and prints it.
📋 What You'll Learn
Create a variable to hold the argument string
Create a variable to hold the converted integer
Use argc and argv to access command-line arguments
Use atoi to convert the string argument to an integer
Print the integer value using printf
💡 Why This Matters
🌍 Real World
Many command-line tools and programs accept numbers as arguments to control their behavior, like setting a timeout or choosing a mode.
💼 Career
Understanding how to parse and use command-line arguments is essential for software developers working on utilities, scripts, or system programs.
Progress0 / 4 steps
1
Set up main function and argument variables
Write the main function header with parameters int argc and char *argv[]. Inside main, declare a variable char *arg and set it to argv[1] to hold the first command-line argument.
C
Hint
Remember, argv[0] is the program name, so the first argument is argv[1].
2
Declare an integer variable for the converted number
Declare an integer variable called num to store the converted number from the argument.
C
Hint
Just declare the variable num as an int.
3
Convert the argument string to an integer
Use the atoi function to convert arg to an integer and store it in num. Write the line num = atoi(arg);.
C
Hint
Use atoi from stdlib.h to convert the string to an integer.
4
Print the converted integer
Use printf to print the integer num with the message: "The number is: %d\n". Write printf("The number is: %d\n", num);.
C
Hint
Use printf with %d to print the integer value.
Practice
(1/5)
1. What does the atoi function do in C when parsing numeric arguments?
easy
A. Converts a string to an integer without error checking
B. Converts a string to a floating-point number
C. Checks if a string contains only digits
D. Parses a string and returns a pointer to the next character
Solution
Step 1: Understand atoi function purpose
atoi converts a string to an integer but does not check for errors or invalid input.
Step 2: Compare with other parsing functions
Unlike strtol, atoi does not provide error detection or pointer to next character.
Final Answer:
Converts a string to an integer without error checking -> Option A
Quick Check:
atoi = simple integer conversion [OK]
Hint: Remember: atoi converts but doesn't check errors [OK]
Common Mistakes:
Thinking atoi checks for invalid input
Confusing atoi with strtol
Assuming atoi returns pointer to next char
2. Which of the following is the correct syntax to parse a string "1234" to an integer using strtol in C?
easy
A. int num = strtol("1234", NULL, 10);
B. long num = strtol("1234", NULL, 10);
C. long num = atoi("1234", NULL, 10);
D. int num = strtol("1234", 10, NULL);
Solution
Step 1: Check strtol return type
strtol returns a long, so the variable must be long.
Step 2: Verify argument order
Arguments are: string, pointer to char* for end, and base (10 for decimal). So strtol("1234", NULL, 10) is correct.
Final Answer:
long num = strtol("1234", NULL, 10); -> Option B
Quick Check:
strtol returns long, args: string, endptr, base [OK]
Hint: Remember strtol returns long, not int [OK]
Common Mistakes:
Using int instead of long for strtol result
Mixing argument order in strtol
Using atoi syntax with strtol
3. What will be the output of this C code snippet?
#include
#include
int main() {
char *str = "42abc";
char *endptr;
long val = strtol(str, &endptr, 10);
printf("%ld %s\n", val, endptr);
return 0;
}
medium
A. Error
B. 0 42abc
C. 42abc (null)
D. 42 abc
Solution
Step 1: Understand strtol parsing behavior
strtol converts initial numeric part "42" to long and sets endptr to point after parsed number, which is "abc".
Step 2: Analyze printf output
It prints the number 42 and then the string starting at endptr, which is "abc".
Final Answer:
42 abc -> Option D
Quick Check:
Parsed number + leftover string = 42 abc [OK]
Hint: Check where endptr points after strtol [OK]
Common Mistakes:
Assuming strtol parses entire string
Ignoring endptr usage
Expecting error on non-digit suffix
4. Identify the error in this code snippet that parses a numeric argument:
#include
int main(int argc, char *argv[]) {
int num = atoi(argv[1]);
if (num == 0) {
printf("Invalid number\n");
}
return 0;
}
medium
A. Missing check if argc > 1 before accessing argv[1]
B. Using int instead of long for atoi result
C. atoi returns 0 for invalid input and valid zero, causing confusion
D. No error, code is correct
Solution
Step 1: Check argument count before access
The code uses argv[1] without verifying argc > 1, risking out-of-bounds access.
Step 2: Understand atoi zero ambiguity
While atoi returns 0 for invalid input and valid zero, the bigger issue is missing argument check causing runtime error.
Final Answer:
Missing check if argc > 1 before accessing argv[1] -> Option A
Quick Check:
Always check argc before argv access [OK]
Hint: Always check argc before argv usage [OK]
Common Mistakes:
Ignoring argc check leads to crashes
Confusing atoi zero return meaning
Assuming atoi handles errors
5. You want to safely parse a command-line argument as a positive integer in C. Which approach correctly handles invalid input and zero?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc <= 1) {
printf("No input provided\n");
return 1;
}
char *endptr;
long val = strtol(argv[1], &endptr, 10);
if (*endptr != '\0' || val <= 0) {
printf("Invalid positive integer\n");
return 1;
}
printf("Parsed value: %ld\n", val);
return 0;
}
hard
A. Fails to check if argv[1] is NULL before parsing
B. Does not handle negative numbers correctly
C. Correctly parses positive integers and rejects invalid or zero input
D. Should use atoi instead of strtol for safety
Solution
Step 1: Check argument count
The code checks if argc <= 1 to ensure input is provided.
Step 2: Use strtol with endptr to detect invalid characters and check if value is positive
It verifies *endptr == '\0' to confirm full string parsed and val > 0 to ensure positive integer.
Final Answer:
Correctly parses positive integers and rejects invalid or zero input -> Option C
Quick Check:
strtol + endptr + value check = safe parsing [OK]
Hint: Use strtol with endptr and check value > 0 [OK]
Common Mistakes:
Using atoi which can't detect invalid input
Not checking endptr for leftover chars
Ignoring zero or negative values
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.