Recommended resources
The freely available resources this lesson will direct you to.
Hello! In our last lesson, we took the first step in making our C programs interact with the outside world by learning how the main function can receive command-line arguments through argc and argv. You learned to access and display these arguments, all of which are passed as strings.
Today, we will build directly on that foundation. Our goal is to write a program that processes command-line arguments. This means moving beyond simply printing the arguments and instead using them to control your program's behavior. We will focus on two critical processing tasks: validating that the user has provided the correct number of arguments, and converting those arguments from strings into numbers so we can perform calculations with them.
1. Validating the Argument Count
A robust program should not crash or produce strange results if the user provides the wrong input. When working with command-line arguments, the first line of defense is to check if you received the number of arguments you expected.
For example, if you write a program that expects two numbers to add, what should it do if the user provides only one? Or none? The best practice is to check argc immediately and, if the count is wrong, print a helpful "usage" message and exit gracefully.
This is a fundamental part of creating user-friendly command-line tools. The following video demonstrates this principle perfectly. It shows what happens when you don't check for the right number of arguments (a crash!) and then shows how to implement a proper check.
Command Line Arguments | C Programming Tutorial
Watch this segment from "Command Line Arguments | C Programming Tutorial" by Portfolio Courses to see how to implement error checking.
Focus on the section that discusses error checking (error checking). Pay attention to: The if (argc != 3) condition. Why 3 and not 2? The error message printed to the user. The use of exit(-1) to terminate the program when input is invalid.
The core pattern for validation is:
#include <stdio.h>
#include <stdlib.h> // Needed for exit()
int main(int argc, char *argv[]) {
// We expect exactly 2 user-provided arguments, so argc must be 3.
// (1 for program name + 2 for user arguments)
if (argc != 3) {
// Print a helpful usage message to stderr (standard error stream)
// Using argv[0] makes the message dynamic to your program's name.
fprintf(stderr, "Usage: %s <argument1> <argument2>\n", argv[0]);
// Exit the program with a non-zero status code to indicate an error
return 1;
}
// If we reach here, we know argc is 3.
// It is now safe to access argv[1] and argv[2].
printf("Processing arguments: %s and %s\n", argv[1], argv[2]);
return 0;
}
This simple check makes your program significantly more reliable. Returning 1 (or any non-zero value) is a standard convention to signal that the program terminated with an error.
2. Converting Strings to Numbers with atoi()
In the previous lesson, we established that all command-line arguments are passed to main as strings. If you pass the number 42, your program receives the string "42". This is a problem if you want to perform math. In C, you cannot use arithmetic operators like + or * on strings.
To solve this, we need to convert the string representation of a number into an actual integer data type. The C standard library provides a handy function for this: atoi().
This section from TutorialsPoint clearly explains the problem of numeric arguments and introduces atoi() as the solution.
Please read the section titled "Passing Numeric Arguments from the Command Line". It first shows the error you'd get trying to add string arguments, and then demonstrates the correct approach using the atoi() function from the <stdlib.h> library.
As the reading shows, atoi (which stands for ASCII to Integer) takes a string as its input and returns the corresponding int.
Now, let's see a practical example of atoi() in action. The next video builds a program that takes two numbers from the command line, converts them to integers, and then uses them to control a for loop.
Command Line Arguments | C Programming Tutorial
Watch this segment from the same "Command Line Arguments" video. It combines the main function signature with the atoi function to build a useful program.
Watch the part demonstrating the atoi function (using atoi). Notice how #include <stdlib.h> is added and how the return values of atoi(argv[1]) and atoi(argv[2]) are stored in int variables.
3. Practical Exercise: A Command-Line Calculator
It's time to combine everything you've learned. Your task is to write a program that acts as a simple adding machine. It will take any number of integers from the command line and print their sum.
Task:
- Create a file named
sum.c. - Write a program that calculates the sum of all the numbers provided as command-line arguments.
- The program should ignore
argv[0](the program name). - If no numbers are provided, it should print
Sum: 0.
Example Usage and Output:
./sum 10 20 5should outputSum: 35./sum 100 -10should outputSum: 90./sumshould outputSum: 0
Hints:
- You will need to include
<stdio.h>forprintfand<stdlib.h>foratoi. - Initialize a
sumvariable to0. - Use a
forloop that starts ati = 1and goes up toargc. - Inside the loop, convert
argv[i]to an integer usingatoi()and add it to yoursumvariable.
Take some time to write and test your solution. This exercise is a perfect test of your understanding of loops, argc, argv, and atoi.
Solution Walkthrough
Below is one possible solution to the exercise. You can find this exact code pattern in the "Summing Command-Line Arguments" example from the w3resource article.
Command-Line arguments in C: Handling argc and argv
This article from w3resource provides a concise and clear implementation for a command-line summation tool.
Review the code under the section "Example: Summing Command-Line Arguments (Integers)". Compare it to your own solution.
Let's break down the code from the article:
#include <stdio.h>
#include <stdlib.h> // For atoi()
int main(int argc, char *argv[]) {
int sum = 0;
// Start loop from i = 1 to skip the program name (argv[0])
for (int i = 1; i < argc; i++) {
// Convert the current string argument to an integer and add to sum
sum += atoi(argv[i]);
}
printf("Sum of arguments: %d\n", sum);
return 0;
}
This solution elegantly combines the concepts. The loop iterates through only the user-supplied arguments. In each iteration, atoi() handles the conversion, and the result is accumulated in sum. If no arguments are given, argc is 1, the loop condition i < argc (i.e., 1 < 1) is immediately false, and the program simply prints the initial sum of 0.
Conclusion
In this lesson, you made the leap from passively receiving command-line arguments to actively processing them. This is a crucial skill for building flexible and powerful command-line utilities in C.
Key Takeaways:
- Always validate
argcto ensure your program receives the expected number of arguments. This prevents crashes and unexpected behavior. - Provide a clear "Usage" message to the user if their input is incorrect.
- The
atoi()function (from<stdlib.h>) is essential for converting string arguments into integers for mathematical operations. - By combining loops and
atoi(), you can process a variable number of numeric arguments to create useful tools.
Preview of the Next Lesson:
You can now receive and process input from the command line. But what if you need to work with large amounts of data, or save your program's results? In the next lesson, you will learn how to make your programs work with files. We will cover how to open, read from, write to, and close text files using functions like fopen, fprintf, and fclose.