How to provide parameters with command Line - c

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

Related

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

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;
}

where to read cmd input like "myapp.exe input" or "myapp.exe -?" (i using cmd)

When I using Java, i need to type command likejava -?If user type -? at the end, why the application know this to reply output? Please tell me c code to identify the -?
They are passed as the parameters to main():
#include <stdio.h>
int main(int argc, const char* argv[])
{
for (int i = 0; i < argc; i++) {
printf("Arg %i is %s\n", i, argv[i]);
}
}
When compiled and then executed as
myProgram.exe arg1 stuff ?
It would output
Arg 0 is myProgram.exe
Arg 1 is arg1
Arg 2 is stuff
Arg 3 is ?
In C you have three options for your main signature. The first is the one that does not take any parameters int main(void). The second one int main() as mentioned in the comments takes any number of parameters but they are unnamed. The third one however has two parameters int main(int argc, char **argv) the names of the parameters do not matter they are just commonly used. These two parameters serve the purpose to provide the command line parameters to your program.
argc: Is the counter variable which holds the number of the provided arguments separated by spaces
argv: contains the command line arguments as an array of c-strings
Your program implicitely receives always one argument which is the name of the application (or \0 if the host environment can not provide that). Here a little example on how to iterate over the arguments:
#include <stdio.h>
int main(int argc, char **argv) {
for(int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
In C, the main is declared as:
int main(int argc, char** argv);
the first argument is the number of parameters while the second one is an array of parameters so, for example in your case you would do:
#include<string.h>
#include<stdio.h>
#define QUESTION_MARK "-?"
int main(int argc, char **argv){
if(argc > 1){
char *qsmark = argv[1];
if(strcmp(qsmark, QUESTION_MARK) == 0){
printf("argv[1] is -?\n");
}
}
return 0;
}
Remember that the first argv is the name of the executable.
Please avoid comparing string by hands though, use the standard library to get if what is pointed by qsmark is actually equal to "-?"
If you can use getopt() or other similar POSIX functions. Then this is one way to go:
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
int main(int argc, char** argv)
{
int opt;
while ((opt = getopt(argc, argv, "h?")) != -1)
{
switch (opt)
{
case '?':
case 'h':
printf("Usage: bla bla\n");
break;
}
}
return EXIT_SUCCESS;
}
Example:
~ # /tmp/temp_test -?
Usage: bla bla
~ # /tmp/temp_test -y
/tmp/temp_test: invalid option -- 'y'
Usage: bla bla
~ #
More information in man page.

Indenting C code, Unix

I searched documentation for indent, but I gave up eventually, I want to indent code like this:
int main(int argc, char **argv){
some code;
}
I know indent -kr gives you braces like this, but -kr style also includes
int
main(int argc, char **argv){
some code;
}
and this int in line before main gives me creeps.
Can anyone please tell me option for this?
The particular options that you are interested in are
-npsl
--dont-break-procedure-type
Put the type of a procedure on the same line as its name.
-brf
--braces-on-func-def-line
Put braces on function definition line.
As suggested, the GNU indent manual describes the various options.
Here is a quick script to illustrate the effect of those options on the basic predefined styles:
#!/bin/sh
for opt in gnu linux orig kr
do
echo "** $opt"
indent -st -$opt -npsl -brf hello.c
done
and the input file:
#include <stdio.h>
int main(int argc, char **argv) { int n; for (n = 0; n < argc; ++n) printf("arg%d=%s\n", n, argv[n]); return 0; }
and corresponding output:
** gnu
#include <stdio.h>
int main(int argc, char **argv) {
int n;
for (n = 0; n < argc; ++n)
printf("arg%d=%s\n", n, argv[n]);
return 0;
}
** linux
#include <stdio.h>
int main(int argc, char **argv) {
int n;
for (n = 0; n < argc; ++n)
printf("arg%d=%s\n", n, argv[n]);
return 0;
}
** orig
#include <stdio.h>
int main(int argc, char **argv) {
int n;
for (n = 0; n < argc; ++n)
printf("arg%d=%s\n", n, argv[n]);
return 0;
}
** kr
#include <stdio.h>
int main(int argc, char **argv) {
int n;
for (n = 0; n < argc; ++n)
printf("arg%d=%s\n", n, argv[n]);
return 0;
}
I do not see an option to suppress the space before the { character.
You are likely looking for the -npsl option. The -psl (--procnames-start-lines) option causes the type of a procedure being defined to be placed on the line before the name of the procedure. Thus if you specify that option, all function declarations will be changed from:
int main(int argc, char **argv){
some code;
}
to
int
main(int argc, char **argv){
some code;
}
You can check whether you are including -psl in the common type -kr and remove it, or if not included, you can specify -npsl (--dont-break-procedure-type) and the type will not be placed on a separate line.
There are trade-off with all options. I like braces on the same line as int main() {, but for function definitions I like braces on the next line. e.g.:
type function
{
...
}
So if you have mutually exclusive preferences such as that, you simply choose the one you want a majority of the code to incorporate and tweak the rest. You might give the following invocation a try:
indent -i 4 -lp -ts 8 -lp -lps -br -brs -blf -ce -cdw -pcs -bs -nbc -npsl -saf -sai -saw -nut
It is somewhat of a balanced indent scheme.

Unix environment running C programs

I am programming C programs in a Unix environment. I need to take a number from a user before the program is executed like so:
./program.out 60
How do I store the integer value in the C program?
You can use argv[] to get command line parameters, e.g.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
if (argc != 2) // check that we have been passed the correct
{ // number of parameters
fprintf(stderr, "Usage: command param\n");
exit(1);
}
n = atoi(argv[1]); // convert first parameter to int
// ... // do whatever you need to with `n`
return 0;
}
int main (int argc, char *argv [ ])
{
//your code
}
argv [1] will then have the address of the numeric string which contains the number.
Then you can change this to an int if needed.
It is quite simple to do and I hope I have got your question right. See below:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Number of arguments is: %d\n", argc);
printf("The entered value is %s\n", argv[1]);
return 0;
}
And then compile it on Linux as:
gcc file.c
./a.out 32
The program should print the value you require.
Hope this helps.

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