IT이야기

C의 주 인수에 대한 인수

cyworld 2022. 5. 17. 22:00
반응형

C의 주 인수에 대한 인수

어떻게 해야 할 지 모르겠어!나는 C 기본에 대해 잘 이해하고 있다.구조, 파일 IO, 문자열 등CLA만 빼고.어떤 이유에서인지 나는 그 개념을 이해할 수 없다.제안, 도움말 또는 조언.PS I는 Linux 사용자

의 서명main다음과 같은 경우:

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

argc사용자에 의해 호출되 명령줄 인수의 개수하는 것을 말합니다, 해당 프로그램의 실제 이름이 들어 있으면 지나갔다. argv인덱스 1로 시작하는 실제 인수를 포함한다.색인 0은 프로그램 이름이다.

프로그램을 이렇게 실행했다면:

./program hello world

다음:

  • argc는 3일 것이다.
  • argv[0]는 "./프로그램"일 것이다.
  • argv[1]는 "안녕"이 될 것이다.
  • argv[2]는 "세계"일 것이다.

이런 식으로 상상해보라.

*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

예를 들어 프로그램 Woluld가 도움이 될 수도 있다.

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 file1 file2

cp는 첫 번째 인수(argv[0] argv[1]가 아닌 경우)이며, 대부분 참조할 필요가 없는 한 첫 번째 인수를 무시해야 한다.

if you made the cp program you understood the main args really...

다른 함수 논쟁처럼 하는 다른 기능과 argc과 argv처럼, 그 차이를 주축으로 C런타임에서 열심히, 전력을 다하여 인수를 지나가며 하지만 C런타임 c도서관에서 그리고 당신은 수정될 수 없다면 우리는 쉘이나 일부 IDE을 통해 프로그램 실행 해야 하는지 그래서, 우리는 메커니즘을 주장 전달하는 데 필요한 정의이라고 불린다는 메인이다.주요 기능은 너의 주요 기능은 다르게는 런타임에 당신의 매개 변수에 따라 행동할 수 있다.는 포인터의 문자열로 값을 초본으로 인수 이행하는 데, 당신은 그것을 제한하지 않으면서 인수를 통과할 수 있는 이 방법, 그 반대가 보유하고 있배열에 엔드 투 엔드 원칙과 argv의 포인터 수를 제공하는 매개 변수 있argc.

Siamore, 나는 모든 사람들이 프로그램을 컴파일하기 위해 명령줄을 사용하는 것을 계속 보고 있다.내 리눅스 박스에 있는 gnu gcc 컴파일러, blocks를 통해 IDe에서 x11 단자를 사용한다.나는 사령부에서 프로그램을 편찬한 적이 없다.Siamore, 프로그램 이름을 cp로 하려면 argv[0]="cp"; Cp는 문자열 리터럴로 초기화해야 하는가?그리고 지휘선상에 무슨 일이 생길까?네가 나에게 Siamore를 준 예는 내가 이해한 거야!입력한 줄이 몇 자 길어도 여전히 한 아그에 불과했다.왜냐하면 그것은 이중 인용문으로 싸여 있었기 때문이다.그래서 프로그 이름인 arg[0]은 실제로 새로운 줄 문자로 문자열이 되는가?그래서 나는 네가 왜 if(argc!=3) 인쇄 오류.프로그 이름 = argv[0]이고 그 뒤에 아그가 2개 더 있고, 더 이상 오류가 발생했기 때문이다.내가 그걸 또 무슨 이유로 사용하겠어?지휘선이나 단말기에서 어떻게 편찬할 것인가에 대한 나의 이해 부족이 이 부분에 대한 이해가 부족한 나의 이유라고 정말 생각한다!!시아모어, 넌 내가 클라에 대해 더 잘 이해할 수 있게 도와줬어!여전히 완전히 이해하지는 못하지만 나는 그 개념을 망각하지는 않는다.나는 단말기에서 컴파일하는 법을 배우고 네가 쓴 것을 다시 읽을 거야.장담하는데, 그럼 완전히 이해하겠어!너의 도움을 조금 더 받아서 lol

<> 내가 직접 쓴 것이 아니라 내 책에서 쓴 암호.

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

출력값:

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?

그래서 argv는 문자열 리터럴의 테이블이고, argc는 그 숫자다.이제 argv[0]는 프로그램의 이름이다.그래서 프로그램을 실행하기 위해 ./CLA를 입력하면 ./CLA는 argv[0]이다.위의 프로그램은 무한대의 인수를 취하도록 명령줄을 설정한다.내가 원하면 3, 4개만 먹도록 할 수 있어.예를 들어, 시아모어... 만약!=3) printf("일부 오류 발생");고마워 Siamore, 너 없이는 못 했을 거야! 그들의 시간과 노력도 감사해!

PS 앞으로 이런 문제가 생길 경우에 대비해서...내가 IDE AKA 코드를 사용하고 있었기 때문에 문제가 생겼다는 것을 당신은 결코 알지 못할 것이다.블록. 위에서 프로그램을 실행하면 프로그램의 경로/디렉토리가 인쇄된다.예: ~/문서/C/CLA.c는 터미널에서 실행하여 명령줄을 사용하여 컴파일해야 한다.gcc -o CLA main.c.는 파일의 디렉토리에 있어야 한다.

@anthony 코드로 조금만 변경해서 인수 번호와 값으로 잘 포맷된 출력을 얻을 수 있었다.인수가 여러 개인 경우 출력에 대해 더 쉽게 읽을 수 있음:

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

그리고 출력은 다음과 유사하다.

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

posix 시스템에 명령줄 인수 파싱의 경우, 표준은 posix 시스템의 명령줄 인수를 구문분석하는 경우 표준은을 사용하는 것입니다.getopt()가족 도서관의 일과 명령줄 인수를 다뤄야 합니다.명령줄 인수를 처리하는 라이브러리 루틴 패밀리.

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

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

반응형