How do i add up all elements of a command line argument - c

here is my code
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{
int a;
for(int i=1;i<=argc;i++){
a+=atoi(argv[i]);
}
printf ("%d",a);
}
I keep getting segmentation faults but i am trying to add up all elements of the command line so for example ./a.out 5 6 7 would give 18 as the output, cheers.

The problem (with the crash) is the loop itself:
for(int i=1;i<=argc;i++)
The argc argument is the number of arguments passed to the program, including the "program name" at argv[0]. So valid indexes for the actual arguments are argv[1] to argv[argc - 1].
Furthermore the argv array is terminated by a null pointer, which will be at argv[argc].
Since you include argv[argc] in your loop you pass a null pointer to atoi which leads to undefined behavior and likely crashes.
The simple solution is to use less-than < instead of less-than-or-equal as the loop condition:
for(int i=1;i<argc;i++)

You never initialized a to 0. Also, use strtol() function.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int a = 0;
for (int i = 1; i < argc; i++) {
a += strtol(argv[i], NULL, 10);
}
printf("%d\n", a);
return EXIT_SUCCESS;
}

Related

How to provide parameters with command Line

i'm trying to deliver parameters for a program with the command line.
I want, that the program is working as shown now:
- start the program with parameter "program.exe "
- then the should be useable in the programm
How can i approach this thing?
Here is the essential part of my programm:
int main(){
int length;
unsigned int i=0;
length=strlen(word);
for(i=0;i<length;i++) {
printf("%d",word[i]);
}
}
And i wanted to add this word[] parameter via command line. Thanks!
int main( int argc, char* argv[] ) {
return 0;
}
argc => argument count / command line parameter count
argv[x] => argument value / parameter text at position
For command line arguments Use argv and argc
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char* argv[] )
{
int i;
printf("argc is %d\n",argc);
for(i = 1; i < argc ; i++){
printf("%d \n", atoi(argv[i]));
}
}
Run your program as
./a.out 10 20 30
argc is 4
10
20
30

Why does this code return a Segmentation Fault?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char** argv){
int xAmount = atoi(argv[1]);
int yAmount = atoi(argv[2]);
double coef[argc - 3];
int i = 0;
for(i=0; i < argc - 3; i++){
coef[i] = atof(argv[i+3]);
}
for(i=0; i < argc-3; i++){
if(i == 0){
printf("y = %.2f",coef[i]);
}
else {
printf(" + %.2fx^%d",coef[i],i);
}
}
return 0;
}
Why does this C code return a segmentation fault? I have looked over other examples and questions that have been having this same issue, but I can't find a similar problem in this code. What am I missing?
This is happening because you are not passing in a command line argument, and the function atoi(s) returns a segfault when s is null.
You should call the function ./your_program_name arg1 arg2 arg3 ... etc
The only thing I see here that could possibly be causing a segfault is the command line arguments array: argv. You are attempting to access this array in multiple parts of your code.
Are you passing the correct command amount and type of command line arguments to this?
A possible solution to make sure this doesn't happen in the future is to set up an if at the beginning of your code that checks argc to make sure if the correct amount of arguments are being passed in.

Why isn't isalpha working?

I'm working with C and I need to check that the user inputed second command line argument argv[1] is made up of only alphabetical charchaters and if not, to do what is inside the else loop. I used the is alpha function but when i compile and run the program no matter what my second command line argument is (alphabetical or otherwise), its always executing the "else loop". How do i fix this?
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
int a = argc;
if (a != 2)
{
return 1;
}
string b = argv [1];
int c = strlen(b);
string m;
for (int i = 0; i < c; i++)
{
if (isalpha(b[c]))
{
m = GetString();
}
else
{
printf("Please provide a valid keyword\n");
return 1;
}
}
}
Try replacing
if (isalpha(b[c]))
with
if (isalpha(b[i]))
Currently you are checking the element at the index which is the result of strlen(b) at every iteration of your loop. Because array indices are zero based in C b[strlen(b)] is referencing '\0', the null terminator.
In reference to the Keith Thompson comment below and the answer to this question you should actually be casting the value passed to isalpha to an unsigned char to ensure that undefined behaviour is not invoked.
Thus you should change your code to
if (isalpha((unsigned char)b[i]))
to ensure there is no UB
Use isalpha(b[i]) instead of isalpha(b[c])
like this:
if (isalpha(b[i]))
{
m = GetString();
}

Basic C programming question

I've just started to learn C and it's going pretty slow...I wanted to write a program that takes in an integer argument and returns it's doubled value (aka take in integer, multiply by 2, and printf that value).
I purposely did not want to use the scanf function. Here's what I have so far and what is not compiling...
#include <stdio.h>
int main(int index)
{
if (!(index)) {
printf("No index given");
return 1;
}
a = index*2;
printf("Mult by 2 %d",a);
return 0;
}
So basically when the program is executed I want to supply the index integer. So, in cygwin, I would write something like ./a 10 and 10 would be stored into the index variable.
Also, I want to program to return "No index given" and exit if no index value was supplied...
Anyone care to help what I'm doing wrong?
EDIT:
This code returns 1 error upon compilation and is based on the help by #James:
#include <stdio.h>
int main(int 1, char index)
{
int index, a;
if (!(index)) {
printf("No index given");
return 1;
}
a = index*2;
printf("Mult by 2 %d",a);
return 0;
}
EDIT 2: Consider a simpler program where a value is just taken and echoed back (as shown below)
#include <stdio.h>
int main(int argc, char* argv[])
{
int index;
index = argv[1];
printf("Index is %d, ", index);
/*if (!(index)) {
printf("No index given");
return 1;
}
a = index*2;
printf("Mult by 2 %d",a);*/
return 0;
}
This program fails to compile...Any ideas?!? Ugh.
EDIT 3: This is the code that finally compiled and works. Thanks all!
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if (argc <= 1)
{
printf("No index given");
return 1;
}
int i;
i = atoi(argv[1]); // convert string in argv[1] to integer
int a;
a = i*2;
printf("Mult by 2: %d",a);
return 0;
}
Thanks!
Amit
There are only two guaranteed-to-work prototypes for the main function: one takes no arguments (int main(void)), the other takes two arguments and looks like this:
int main(int argc, char* argv[])
argc is the number of arguments passed to the program, and argv is an array containing the arguments passed to the program.
If you want to pass an argument when you run the program (and not prompt the user for input), you will need to
use the form of main taking arguments,
check to make sure argc is greater than one (argv[0] is the program name, or should be),
convert argv[1] from its string representation to an integer, using strtol, sscanf, or some other library function (avoid atoi: it provides no usable error reporting),
then use that integer.
As you probably know, main() is a "special" function, which expects either 0 or two arguments: int argc, and char **argv, where argc is automagically assigned the number of arguments in the argument array argv. So, whatever arguments you pass to main() will be stored in argv, and that is from where you need to access your arguments.
This link should help.
The arguments you are passing into the program are text, and so main will receive them as strings. It splits the command line arguments by whitespace and passes them in as an array of strings, along with a number stating the number of parameters it is giving you. The program will always have at least one argument, the name of the file you ran the program as (which is in this case "a"). This string is always found at argv[0].
As the other answers stated, the correct signature for main is int main(int argc, char* argv[]). When you run ./a 10, argc will be 2 and argv[1] will be the string "10". You will need to convert this string to an integer to multiply it by 2, using something like int i = atoi(argv[1]); or int i; sscanf(argv[1], "%d", &i);.
Here is a correction to your code using the proper prototype for a Main with command line arguments.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if (argc <= 1)
{
printf("No index given");
return 1;
}
int i = atoi(argv[1]); // convert string in argv[1] to integer
int a = i*2;
printf("Mult by 2 %d",a);
return 0;
}

how to print a string vertically in c?

Ok the output is supposed to look like this:
./a 3 4 8 2
3
4
8
2
This is what I have so far, but I am lost and can only get the first integer to print (we have to use GetInt, which gets the specified integer in the string):
int main (int argc, char*argv []){
int v;
int i;
i = 1;
v = GetInt(argc, argv, i + 1);
if(argc >= 1){
printf("%d\n", GetInt(argc, argv, i));
}
return 0;
}
Looks like you need to use a for-loop to get each value in turn.
Without actually seeing your implementation of GetInt, something like this (Assumes C90):
#include <stdio.h>
int GetInt( int argc, char* argv[], int i ) {
/*
* you may want to use sscanf, strtol or other functions,
* but you haven't specified
*/
return atoi( argv[i] );
}
int main ( int argc, char* argv[] ) {
int i;
for ( i = 1; i < argc; ++i ) {
printf( "%d\n", GetInt( argc, argv, i ) );
}
return 0;
}
Returns:
$ ./a.out 3 4 8 2
3
4
8
2
Error checking omitted and such. It is an exercise to you to figure out how to deal with non-decimal arguments.
As a note, why do you have to use GetInt()? It's completely superfluous and not part of a standard library, and unless you wrote it yourself (or in class), I can't imagine ever using it. This is what I would do:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i = 1; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
I know it doesn't use GetInt(), but it's shorter, and you probably shouldn't be using GetInt() because it's kind of useless. Plus, there's already an atoi() function and, if you don't want to use that because it's outdated, a strtol() function you can recast as an int if you have to.
I'm not citicizing you or anything, I'm just wondering why you're being required to use this superfluous, nonstandard function.
Use printf() in a loop. argc is the number of white space separated arguments in argv[], in the example above, argc = 5.

Resources