development

C에서 main에 대한 인수

big-blog 2020. 12. 6. 21:48
반응형

C에서 main에 대한 인수


이 질문에 이미 답변이 있습니다.

나는 무엇을 해야할지 모른다! 저는 C 기본에 대해 잘 알고 있습니다. 구조, 파일 IO, 문자열 등. CLA를 제외한 모든 것. 어떤 이유로 나는 개념을 이해할 수 없습니다. 모든 제안, 도움 또는 조언. 추신 : 나는 리눅스 사용자입니다


의 서명 main은 다음과 같습니다.

int main(int argc, char **argv);

argc전달 된 명령 줄 인수의 수를 나타내며 사용자가 호출 한 프로그램의 실제 이름 포함 합니다. argv인덱스 1로 시작하는 실제 인수를 포함합니다. 인덱스 0은 프로그램 이름입니다.

따라서 다음과 같이 프로그램을 실행했다면 :

./program hello world

그때:

  • argc는 3입니다.
  • argv [0]은 "./program"이됩니다.
  • argv [1]은 "hello"입니다.
  • argv [2]는 "world"가됩니다.

posix 시스템에서 명령 줄 인수를 구문 분석하는 경우 표준은 getopt()라이브러리 루틴 제품군 을 사용하여 명령 줄 인수를 처리하는 것입니다.

좋은 참조는 GNU getopt 매뉴얼입니다.


이렇게 상상 해봐

*main() is also a function which is called by something else (like another FunctioN)

*the arguments to it is decided by the FunctioN

*the second argument is an array of strings

*the first argument is a number representing the number of strings

*do something with the strings

아마도 예제 프로그램이 도움이 될 것입니다.

int main(int argc,char *argv[])
{

    printf("you entered in reverse order:\n");

    while(argc--)
    {
        printf("%s\n",argv[argc]);
    }

return 0;
}

그것은 단지 당신이 입력하는 모든 것을 인자로 역순으로 인쇄하지만 당신은 더 유용한 것을하는 새로운 프로그램을 만들어야합니다.

컴파일 (안녕하세요)과 같은 인수를 사용하여 터미널에서 실행하십시오.

./hello am i here

그런 다음 두 문자열이 서로 반대인지 확인하도록 수정하려고 시도한 다음 다른 것이 오류를 인쇄하면 argc 매개 변수가 정확히 3인지 확인해야합니다.

if(argc!=3)/*3 because even the executables name string is on argc*/
{
    printf("unexpected number of arguments\n");
    return -1;
}

그런 다음 argv [2]가 argv [1]의 반대인지 확인하고 결과를 인쇄합니다.

./hello asdf fdsa

출력해야

they are exact reverses of each other

가장 좋은 예는 파일 복사 프로그램입니다. cp와 같습니다.

cp 파일 1 파일 2

cp는 첫 번째 인수 (argv [1]가 아닌 argv [0])이며 참조 또는 무언가가 필요하지 않는 한 대부분 첫 번째 인수를 무시해야합니다.

당신이 cp 프로그램을 만들었다면 당신은 주요 args를 정말로 이해했습니다.


Siamore, 저는 모든 사람들이 프로그램을 컴파일하기 위해 명령 줄을 사용하는 것을 계속보고 있습니다. 내 리눅스 박스의 gnu gcc 컴파일러 인 code :: blocks를 통해 ide에서 x11 터미널을 사용합니다. 명령 줄에서 프로그램을 컴파일 한 적이 없습니다. 그래서 Siamore, 프로그램 이름을 cp로 지정하려면 argv [0] = "cp"를 초기화해야합니까? Cp는 문자열 리터럴입니다. 그리고 stdout에가는 것은 명령 줄에 간다 ??? 당신이 나에게 준 예는 이해했다! 입력 한 문자열이 몇 단어 길이 였지만 여전히 하나의 인수였습니다. 큰 따옴표로 묶었 기 때문입니다. 따라서 prog 이름 인 arg [0]은 실제로 새 줄 문자가있는 문자열 리터럴입니까 ?? 그래서 왜 if (argc! = 3) 인쇄 오류를 사용하는지 이해합니다. prog name = argv [0]이고 그 뒤에 2 개의 args가 더 있고 더 이상 오류가 발생했기 때문입니다. 다른 이유는 무엇입니까? 명령 줄이나 터미널에서 컴파일하는 방법에 대한 이해 부족이이 영역에 대한 이해 부족의 이유라고 생각합니다 !! Siamore, 당신은 내가 cla가 훨씬 더 잘 이해하도록 도와주었습니다! 여전히 완전히 이해하지는 못하지만 개념을 잊은 것은 아닙니다. 나는 터미널에서 컴파일하는 법을 배우고 당신이 쓴 것을 다시 읽을 것입니다. 내기하면 완전히 이해할 것입니다! 조금만 더 도와 주면 ㅋㅋ

<> Code that I have not written myself, but from my book.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 

This is the output:

anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man
The follow arguments were passed to main(): hey man
anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing?
The follow arguments were passed to main(): hi how are you doing?

So argv is a table of string literals, and argc is the number of them. Now argv[0] is the name of the program. So if I type ./CLA to run the program ./CLA is argv[0]. The above program sets the command line to take an infinite amount of arguments. I can set them to only take 3 or 4 if I wanted. Like one or your examples showed, Siamore... if(argc!=3) printf("Some error goes here"); Thank you Siamore, couldn't have done it without you! thanks to the rest of the post for their time and effort also!

PS in case there is a problem like this in the future...you never know lol the problem was because I was using the IDE AKA Code::Blocks. If I were to run that program above it would print the path/directory of the program. Example: ~/Documents/C/CLA.c it has to be ran from the terminal and compiled using the command line. gcc -o CLA main.c and you must be in the directory of the file.


Main is just like any other function and argc and argv are just like any other function arguments, the difference is that main is called from C Runtime and it passes the argument to main, But C Runtime is defined in c library and you cannot modify it, So if we do execute program on shell or through some IDE, we need a mechanism to pass the argument to main function so that your main function can behave differently on the runtime depending on your parameters. The parameters are argc , which gives the number of arguments and argv which is pointer to array of pointers, which holds the value as strings, this way you can pass any number of arguments without restricting it, it's the other way of implementing var args.


Had made just a small change to @anthony code so we can get nicely formatted output with argument numbers and values. Somehow easier to read on output when you have multiple arguments:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("The following arguments were passed to main():\n");
    printf("argnum \t value \n");
    for (int i = 0; i<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

And output is similar to:

The following arguments were passed to main():
0        D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe
1        -P
2        TestHostAttoshiba
3        _http._tcp
4        local
5        80
6        MyNewArgument
7        200.124.211.235
8        type=NewHost
9        test=yes
10       result=output

참고URL : https://stackoverflow.com/questions/4176326/arguments-to-main-in-c

반응형