c에서 int main은 무엇을 의미합니까? int main()과 int main(void)의 차이점은 무엇입니까? 공식 및 실제 매개변수

기능 메인.

모든 C 및 C++ 프로그램에는 main 함수가 있어야 합니다. 어디에 놓을지는 당신에게 달려 있습니다. 일부 프로그래머는 이를 파일 시작 부분에 배치하고 일부 프로그래머는 파일 끝에 배치합니다. 그러나 위치에 관계없이 다음 사항을 기억해야 합니다. "main" 함수에 대한 인수. Borland C++ 시작 프로시저에서는 argc, argv 및 env의 세 가지 매개변수(인수)를 기본 함수로 보냅니다. - 정수인 argc는 기본 함수에 전송된 명령줄 인수의 수입니다. - argv는 문자열(char *)에 대한 포인터 배열입니다. DOS 3.x 이상에서는 argv가 실행될 프로그램의 전체 경로로 정의됩니다. 이전 버전의 DOS에서 실행할 때 argv는 널 문자열("")을 가리킵니다. argv는 프로그램 이름 뒤의 첫 번째 명령줄을 가리킵니다. argv는 프로그램 이름 다음의 두 번째 명령줄을 가리킵니다. argv는 main으로 전송된 마지막 인수를 가리킵니다. argv에 NULL이 포함되어 있습니다. - env는 문자열에 대한 포인터 배열이기도 합니다. 각 env 요소에는 ENVVAR=value 형식의 문자열이 포함되어 있습니다. ENVVAR은 PATH 또는 87과 같은 환경 변수의 이름입니다.<значение>이는 주어진 환경 변수의 값입니다(예: C:\DOS;C:\TOOLS(PATH의 경우) 또는 YES(87의 경우)). 그러나 이러한 인수 중 일부를 지정하는 경우 argc, argv, env 순서로 지정해야 합니다. 예를 들어, 다음 인수 선언은 유효합니다: main() main(int argc) /* 유효하지만 좋지 않음 */ main(int argc, char *argv) main(int argc, char *argv, char *env) Main (int) 선언 argc)은 매개변수의 수를 알지만 직접 액세스할 수 없기 때문에 그리 편리하지 않습니다. env 인수는 Environ 전역 변수를 통해 항상 액세스할 수 있습니다. Environ 변수(3장)와 putenv 및 getenv 함수(2장)를 참조하세요. argc 및 argv 매개변수는 _argc 및 _argv 변수를 통해서도 사용할 수 있습니다. argc, argv 및 env를 사용하는 예제 프로그램. 이것은 주 함수에 전달된 인수를 사용하는 가장 간단한 방법을 보여주는 예제 프로그램 ARGS.EXE입니다. /* ARGS.C 프로그램 */ #include #포함하다 void main(int argc, char *argv, char *env) ( int i; printf("argc의 값은 %d입니다. \n\n",argc); printf("명령줄에 %d개의 매개변수가 포함되어 있습니다. \n\ n",argc); for (i=0; i<=argc; i++) printf(" argv[%d]: %s\n",i,argv[i]); printf("Среда содержит следующие строки:\n"); for (i=0; env[i] != NULL; i++) printf(" env[%d]: %s\n",i,env[i]); return 0; } Предположим, что вы запускаете программу ARGS.EXE со следующей командной строкой: C:> args first_arg "공백이 있는 인수" 3 4 "마지막은 하나" 중지하세요! 프로그램 호출의 "공백이 있는 인수" 및 "하나를 제외한 마지막" 예제에 표시된 것처럼 공백이 있는 인수를 큰따옴표로 묶어 보낼 수 있습니다. 프로그램을 실행하면 다음과 같은 결과가 나타납니다. argc의 값은 7입니다. 명령줄에는 7개의 매개변수가 포함되어 있습니다. argv: c:\turboc\testargs.exe argv: first_arg argv: 공백이 있는 arg argv: 3 argv: 4 argv: 마지막이지만 하나의 argv: 중지하세요! 환경에는 다음 줄이 포함되어 있습니다. env: COMSPEC=C:\COMMAND.COM env: PROMPT=$p $g env: PATH=C:\SPRINT;C:\DOS;C:\BC 명령의 최대 총 길이 주 기능으로 전송되는 줄(공백 및 프로그램 자체 이름 포함)은 128자를 초과할 수 없습니다. 이는 DOS 제한사항입니다. 명령줄 이스케이프 문자 명령줄 인수에는 이스케이프 문자가 포함될 수 있습니다. 그러나 예를 들어 DOS 복사 명령을 사용하여 수행되는 것과 동일한 방식으로 인수와 일치하는 모든 파일 이름을 확장할 수 있습니다. 이스케이프 기호를 사용하려면 프로그램을 링커와 연결할 때 Borland C++와 함께 제공되는 WILDARGS.OBJ 개체 파일을 포함해야 합니다. WILDARGS.OBJ 파일이 프로그램에 첨부된 경우 명령줄에서 "*.*"와 같은 인수를 사용할 수 있습니다. 이 경우 이 마스크와 일치하는 모든 파일의 이름이 argv 배열에 입력됩니다. argv 배열의 최대 크기는 동적 메모리 영역의 크기에만 의존합니다. 특정 마스크에 적합한 파일을 찾을 수 없으면 명령줄에 입력한 형식으로 인수가 전달됩니다. (즉, 메인 함수에는 이스케이프 문자가 포함된 문자열이 전달됩니다.) 큰따옴표("...")로 묶인 인수는 확장되지 않습니다. 예. 다음 명령은 ARGS.C 파일을 컴파일하고 WILDARGS.OBJ 모듈에 링크한 후 결과 ARGS.EXE 프로그램을 실행합니다. bcc args wildarg.obj args C:\BORLANDC\INCLUDE\*.H "*.C" ARGS.EXE를 실행할 때 첫 번째 인수는 Borland C++ INCLUDE 디렉토리에서 확장자가 H인 모든 파일의 이름으로 확장됩니다. 모든 행에는 전체 경로가 포함됩니다(예: C:\TC\INCLUDE\ALLOC.H). *.C 인수는 확장되지 않습니다. 따옴표로 묶여 있습니다. 통합 환경(BC.EXE)에서 작업하는 경우 프로젝트 메뉴에서 다음 줄을 포함해야 하는 프로젝트 파일 이름을 지정하기만 하면 됩니다. ARGS WILDARGS.OBJ 그런 다음 "실행/인수"를 사용하여 " 명령을 실행하려면 명령줄 매개변수를 설정해야 합니다. 논평. 이스케이프 문자 처리가 항상 발생하도록 하려면 다음과 같이 하십시오. WILDARGS.OBJ가 링크 편집기에 의해 자동으로 연결되도록 하려면 표준 C?.LIB 라이브러리를 수정하여 WILDARGS.OBJ 파일을 포함해야 합니다. 이렇게 하려면 라이브러리에서 SETARGV를 제거하고 WILDARGS를 추가하십시오. 이는 다음 명령을 사용하여 수행할 수 있습니다(표준 라이브러리 및 WILDARGS.OBJ가 현재 디렉토리에 포함되어 있다고 가정): TLIB는 사용자 가이드의 7장 유틸리티에 설명되어 있습니다. tlib cs -setargv +wildargs tlib cc - setargv +wildargs tlib cm -setargv +wildargs tlib cl -setargv +wildargs tlib ch -setargv +wildargs -p 스위치를 사용하여 컴파일(파스칼 호출 규칙) 파스칼 호출 규칙을 사용하여 프로그램을 컴파일하는 경우(자세한 내용은 9장 "에서 설명) Interfacing with Assembly Language", "프로그래머 가이드"), 메인 함수는 명시적으로 C 함수로 선언되어야 한다는 점을 기억해야 합니다. 이는 다음을 사용하여 수행할 수 있습니다. 예어 cdecl은 다음과 같습니다. cdecl main(int argc, char *argv, char *env) 기본 함수에서 반환된 값입니다. main 함수는 프로그램의 종료 코드인 값을 반환합니다. 이는 정수입니다. 그러나 프로그램이 종료(또는 _exit) 함수를 사용하여 종료하는 경우 반환 값은 해당 함수의 인수가 됩니다. 예를 들어, 프로그램에 exit(1) 호출이 포함되어 있으면 종료 코드는 1이 됩니다. Borland C++ 통합 환경(BC.EXE)을 사용하여 프로그램을 실행하는 경우 기본 명령의 반환 값을 볼 수 있습니다. "파일 | 정보 가져오기"를 선택하여 기능을 수행합니다.

페이지 53/85

1.5.3. 매개변수를 메인 함수에 전달하기

C 프로그램 실행을 시작하는 주요 기능은 외부 환경(예: 명령줄)에서 전달되는 매개변수를 사용하여 정의할 수 있습니다. 외부 환경에는 데이터 표현에 대한 자체 규칙이 있습니다. 오히려 모든 데이터는 문자열 형식으로 표시됩니다. 이러한 문자열을 주 함수에 전달하려면 두 개의 매개변수가 사용됩니다. 첫 번째 매개변수는 전송할 문자열 수를 전송하는 데 사용되고 두 번째 매개변수는 문자열 자체를 전송하는 데 사용됩니다. 이러한 매개변수의 공통(필수는 아님) 이름은 argc 및 argv입니다. argc 매개변수는 int 유형이며 해당 값은 명령줄 분석을 통해 형성되며 호출된 프로그램의 이름을 포함하여 명령줄에 있는 단어 수와 같습니다(단어는 공백을 포함하지 않는 모든 텍스트입니다). 성격). argv 매개변수는 문자열에 대한 포인터 배열이며, 각 포인터에는 명령줄의 한 단어가 포함되어 있습니다. 단어에 공백 문자가 포함되어야 하는 경우 명령줄에 쓸 때 따옴표로 묶어야 합니다.

주 함수에는 일반적으로 argp라고 하는 세 번째 매개변수가 있을 수도 있으며, 이 매개변수는 프로그램이 C 프로그래밍 언어로 실행되는 운영 체제(환경)의 매개변수를 주 함수에 전달하는 역할을 합니다.

주요 함수 헤더는 다음과 같습니다:

예를 들어, C 프로그래밍 언어로 된 프로그램의 명령줄은 다음과 같습니다.

A:\>"C 프로그램" 1을 작동하는 cprog

그러면 인수 argc, argv, argp가 그림 1의 다이어그램에 표시된 대로 메모리에 표시됩니다.

인수[4]
argv --> -->
-->
-->
-->
argp --> -->
-->
-->
-->
그림 1. 명령줄 옵션 레이아웃

운영 체제는 argc, argv, argp 매개 변수에 대한 값 전달을 지원하며 실제 인수를 기본 함수에 전달하고 사용하는 것은 사용자의 책임입니다.

다음 예제는 운영 체제 및 운영 체제 매개 변수에서 기본 함수에 전달된 실제 인수를 인쇄하는 프로그램입니다.

예:
int main(int argc, char *argv, char *argp)
( int i=0;
printf("\n프로그램 이름 %s", argv);
for (i=1; i>=argc; i++)
printf("\n 인수 %d은(는) %s입니다.", argv[i]);
printf("\n운영 체제 설정:");
동안(*argp)
( printf ("\n %s",*argp);
argp++;
}
반환(0);
}

운영 체제 매개변수는 geteuv 라이브러리 함수를 사용하여 액세스할 수도 있습니다. 해당 프로토타입은 다음과 같습니다.

char *geteuv(const char *varname);

이 함수에 대한 인수는 geteuv 함수에 의해 반환될 값에 대한 포인터인 환경 매개변수의 이름을 지정합니다. 지정된 매개변수가 현재 환경에 정의되어 있지 않으면 반환 값은 NULL입니다.

geteuv 함수로 얻은 포인터를 사용하면 운영 체제 매개변수의 값을 읽을 수만 있고 변경할 수는 없습니다. puteuv 함수는 시스템 매개변수의 값을 변경하는 데 사용됩니다.

C 프로그래밍 언어 컴파일러는 메인 함수에 전달된 인수를 처리하고 환경 매개변수 값을 전달하는 등 프로그램 시작 부분에서 일부 초기화가 수행되는 방식으로 C 프로그램을 구성합니다. 이러한 작업은 컴파일러에 의해 항상 기본 함수 앞에 배치되는 라이브러리 함수 _setargv 및 _seteuv에 의해 수행됩니다.

C 프로그래밍 언어의 프로그램이 운영 체제 매개 변수의 인수 및 값 전달을 사용하지 않는 경우 C 프로그램에 프로그래밍 언어로 배치하여 라이브러리 함수 _setargv 및 _seteuv의 사용을 금지하는 것이 좋습니다. 주 함수 앞에는 이름이 같지만 어떤 작업도 수행하지 않는 함수(스텁)가 있습니다. 이 경우 프로그램 시작은 다음과 같습니다.

setargv()
}
-seteuv()
( return ; /* 빈 함수 */
}
정수 메인()
( /* 인수가 없는 기본 함수 */
...
...
재귀(0);
}

위 프로그램에서 라이브러리 함수 _setargv 및 _seteuv를 호출하면 사용자가 프로그램에 배치한 함수가 사용되며 어떠한 작업도 수행하지 않습니다. 이렇게 하면 결과 exe 파일의 크기가 크게 줄어듭니다.

Borland C++는 main()에 세 가지 인수를 지원합니다. 처음 두 개는 전통적인 argc와 argv입니다. 이는 ANSI C 표준에 의해 정의된 main()에 대한 유일한 인수이며 명령줄 인수를 프로그램에 전달할 수 있습니다. 명령줄 인수는 운영 체제 명령줄에서 프로그램 이름 뒤에 오는 정보입니다. 예를 들어, 프로그램이 Borland 라인 컴파일러를 사용하여 컴파일되면 일반적으로 bcc 형식이 됩니다. 프로그램_이름

어디 프로그램_이름컴파일이 필요한 프로그램입니다. 프로그램 이름은 컴파일러에 인수로 전달됩니다.

argc 매개변수는 명령줄 인수의 개수를 포함하며 정수입니다. 프로그램 이름이 첫 번째 인수로 적합하므로 항상 1 이상입니다. argv 매개변수는 문자 포인터 배열에 대한 포인터입니다. 이 배열의 각 요소는 명령줄 인수를 가리킵니다. 모든 명령줄 인수는 문자열입니다. 모든 숫자는 프로그램에 의해 내부 형식으로 변환됩니다. 다음 프로그램은 프로그램 이름 바로 뒤에 입력할 때 "Hello"와 사용자 이름을 인쇄합니다.

#포함하다

{
if(argc!=2)
{
printf("이름을 입력하는 것을 잊으셨습니다\n");
1을 반환합니다.
}
printf("안녕하세요 %s", argv);
0을 반환합니다.
}

이 프로그램 이름을 호출하고 사용자 이름이 Sergey인 경우 프로그램을 시작하려면 다음을 입력해야 합니다.
이름은 세르게이.
프로그램의 결과로 다음이 나타납니다.
"안녕하세요 세르게이."

명령줄 인수는 공백이나 탭으로 구분해야 합니다. 쉼표, 세미콜론 및 유사한 문자는 구분 기호로 간주되지 않습니다. 예를 들어:

3개의 라인으로 구성되어 있지만,

허브,릭,프레드

이것은 한 줄입니다. 쉼표는 구분 기호가 아닙니다.

공백이나 탭이 포함된 문자열을 단일 인수로 전달해야 하는 경우 큰따옴표로 묶어야 합니다. 예를 들어, 다음은 하나의 인수입니다.

"이건 테스트야"

argv를 올바르게 선언하는 것이 중요합니다. 가장 일반적인 방법은 다음과 같습니다.

빈 괄호는 배열의 길이가 고정되어 있지 않음을 나타냅니다. 당신은 액세스할 수 있습니다 개별 요소 argv 인덱싱을 사용합니다. 예를 들어, argv는 항상 프로그램 이름이 포함된 첫 번째 줄을 가리킵니다. argv는 다음 줄을 가리킵니다.

다음은 명령줄 인수를 사용하는 간단한 예입니다. 명령줄에 지정된 값부터 카운트다운하고 0에 도달하면 신호를 내보냅니다. 첫 번째 인수에는 표준 atoi() 함수를 사용하여 정수로 변환된 숫자가 포함되어 있습니다. 문자열 "display"가 두 번째 인수로 존재하면 카운터 자체가 화면에 표시됩니다.

/* 계산 프로그램 */

#포함하다
#포함하다
#포함하다
int main(int argc, char *argv)
{
int 디스플레이, 개수;
if(argc<2)
{
printf("카운트의 길이를 입력해야 합니다\n");
printf("명령줄에서 다시 시도하세요.\n");
1을 반환합니다.
}
if (argc==3 && !strcmp(argv,"display")) disp = 1;
그렇지 않으면 disp = 0;
for(count=atoi(argv); 개수; -count)
if (disp) printf("%d ", count);
printf("%c", "\a"); /* 대부분의 컴퓨터에서는 호출입니다 */
0을 반환합니다.
}

인수를 지정하지 않으면 오류 메시지가 나타납니다. 이는 올바른 정보 없이 프로그램을 실행하려고 시도한 경우 명령줄 인수를 사용하여 명령을 실행하는 프로그램에서 가장 일반적입니다.

개별 명령줄 문자에 액세스하려면 argv에 두 번째 인덱스를 추가하세요. 예를 들어, 다음 프로그램은 호출된 모든 인수를 한 번에 한 문자씩 인쇄합니다.

#포함하다
int main(int argc, char *argv)
{
int t, i;
for(t=0;t {
나는 = 0;
동안(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf(" ");
}
0을 반환합니다.
}

첫 번째 인덱스는 문자열에 액세스하기 위한 것이고 두 번째 인덱스는 문자열의 문자에 액세스하기 위한 것임을 기억해야 합니다.

일반적으로 argc 및 argv는 소스 명령을 얻는 데 사용됩니다. 이론적으로 최대 32767개의 인수를 갖는 것이 가능하지만 대부분의 운영 체제에서는 이에 근접하는 것조차 허용하지 않습니다. 일반적으로 이러한 인수는 파일 이름이나 옵션을 지정하는 데 사용됩니다. 명령줄 인수를 사용하면 프로그램에 전문적인 느낌이 부여되고 프로그램을 배치 파일에서 사용할 수 있습니다.

Borland C++와 함께 제공되는 WILDARGS.OBJ 파일을 포함하는 경우 *.EXE 유형 인수에서 템플릿을 사용할 수 있습니다. (Borland C++는 자동으로 와일드카드를 처리하고 이에 따라 argc를 증가시킵니다.) 예를 들어, WILDARGS.OBJ를 다음 프로그램에 연결하면 명령줄에 지정된 파일 이름과 일치하는 파일 수를 알려줍니다.

/* 이 프로그램을 WILDARGS.OBJ와 연결 */

#포함하다
int main(int argc, char *argv)
{
i에 등록하세요;
printf("%d개의 파일이 지정된 이름과 일치합니다\n", argc-1);
printf("그들은: ");
for(i=1; 나는 printf("%s ", argv[i]);
0을 반환합니다.
}

이 프로그램을 WA라고 호출하고 다음과 같이 실행하면 EXE 확장자를 가진 파일 수와 이러한 파일 이름 목록을 얻을 수 있습니다.

argc 및 argv 외에도 Borland C++는 세 번째 명령줄 인수인 -env도 제공합니다. env 매개변수를 사용하면 프로그램이 운영 체제 환경에 대한 정보에 액세스할 수 있습니다. env 매개변수는 argc 및 argv 뒤에 와야 하며 다음과 같이 선언됩니다.

보시다시피 env는 argv와 같은 방식으로 선언됩니다. argv와 마찬가지로 문자열 배열에 대한 포인터입니다. 각 줄은 운영 체제에서 정의한 환경 문자열입니다. env 매개변수에는 환경 행 수를 알려주는 동등한 argc 매개변수가 없습니다. 대신 환경의 마지막 줄은 null입니다. 다음 프로그램은 현재 운영 체제에 정의된 모든 환경 문자열을 인쇄합니다.

/* 이 프로그램은 모든 환경 라인을 표시합니다 */

#포함하다
int main(int argc, char *argv, char *env)
{
정수 t;
for(t=0; 환경[t]/t++)
printf("%s\n", env[t]);
0을 반환합니다.
}

argc 및 argv는 프로그램에서 사용되지 않지만 매개변수 목록에는 있어야 합니다. C는 매개변수 이름을 모릅니다. 대신 매개변수가 선언된 순서에 따라 사용 여부가 결정됩니다. 실제로 원하는 대로 매개변수를 호출할 수 있습니다. argc, argv 및 env는 전통적인 이름이므로 프로그램을 읽는 사람이 이것이 main() 함수에 대한 인수라는 것을 즉시 이해할 수 있도록 계속 사용하는 것이 가장 좋습니다.

프로그램의 일반적인 작업은 환경 문자열에 정의된 값을 조회하는 것입니다. 예를 들어, PATH 행의 내용을 통해 프로그램은 검색 경로를 사용할 수 있습니다. 다음 프로그램은 표준 검색 경로를 선언하는 문자열을 찾는 방법을 보여줍니다. 이는 다음과 같은 프로토타입을 갖는 표준 라이브러리 함수 strstr()을 사용합니다.

Char *strstr(const char *str1, const char *str2);

strstr() 함수는 str2가 가리키는 문자열에서 str1이 가리키는 문자열을 검색합니다. 그러한 문자열이 발견되면 첫 번째 위치에 대한 포인터가 반환됩니다. 일치하는 항목이 없으면 함수는 NULL을 반환합니다.

/* 프로그램은 환경 문자열 중에서 PATH를 포함하는 줄을 검색합니다 */

#포함하다
#포함하다
int main(int argc, char *argv, char *env)
{
정수 t;
for(t=0; 환경[t]; t++)
{
if(strstr(env[t], "PATH"))
printf("%s\n", env[t]);
}
0을 반환합니다.
}

모든 C 프로그램은 main() 함수 호출로 시작됩니다. 이 기능은 모든 프로그램에 있어야 합니다.

다른 함수와 마찬가지로 main() 함수에도 매개변수가 있을 수 있습니다. 때로는 프로그램을 시작할 때 일부 정보를 전달하는 것이 유용할 때가 있습니다. 이 정보는 명령줄 인수를 사용하여 main()에 전달됩니다. 명령줄 인수– 프로그램 개발 환경 외부에서 실행을 위해 프로그램을 실행할 때 프로그램 이름 뒤의 명령줄에 입력하는 정보입니다. 예를 들어 task.cpp 파일 보관을 시작하려면 명령줄에 다음을 입력해야 합니다.

윈라 아치태스크task.cpp // winrar.exe 아치태스크task.cpp

여기서 winrar는 아카이버 프로그램의 이름이고 " », « 아치태스크" 그리고 " . cpp» 프로그램에 아카이브를 생성하라고 지시하는 명령줄 인수를 나타냅니다(" ") 이름 포함 아치태스크하나의 파일에서 . cpp.

main() 함수에 매개변수를 전달할 때 다음과 같이 정의해야 합니다.

int main(int argc, char *argv) ( ) // 또는 void main(...)()

argc 매개변수는 명령줄의 인수 수를 포함하고 정수이며, 첫 번째 인수는 항상 프로그램 이름(프로그램에 대한 전체 경로가 포함된 프로그램 이름)이기 때문에 항상 1 이상입니다.

argv 매개변수는 문자열에 대한 포인터 배열에 대한 포인터입니다. 이 배열에서 각 요소는 다음 명령줄 인수를 가리킵니다. 빈 대괄호는 배열의 길이가 무한함을 나타냅니다. argv 배열을 인덱싱하여 개별 인수에 액세스할 수 있습니다. 예를 들어, argv는 항상 프로그램 이름인 첫 번째 문자열을 가리킵니다. argv는 첫 번째 인수를 가리킵니다. 인수 목록은 NULL로 제한됩니다. 즉, argv == NULL.

명령줄 인수 중 하나의 개별 문자에 액세스하려면 argv의 두 번째 인덱스를 사용해야 합니다. 즉, 첫 번째 인덱스 argv는 문자열에 대한 액세스를 제공하고 두 번째 인덱스는 개별 문자에 대한 액세스를 제공합니다.

모든 명령줄 인수는 문자열이므로 프로그램 개발 시 숫자 매개변수를 원하는 형식으로 변환하는 기능이 프로그램에서 제공되어야 합니다.

기호 형식의 숫자를 정수와 실수로 변환하는 다양한 방법이 있는 프로그램의 예:

#포함하다

#포함하다

// 시작 시 예를 들어 다음 인수를 설정합니다. 100 2.7

void main(int a, char *b) (

k = strtol(b, &ptr, 10); // ptr = 해당 줄의 오류 주소

f = strtod(b, &ptr);

sscanf(b, "%d", &k);

sscanf(b, "%lf", &f);

argc 및 argv 이름은 전통적이지만 필수는 아닙니다. main() 함수의 이 두 매개변수는 원하는 대로 호출할 수 있습니다.

명령줄 인수를 사용하는 간단한 예:

int main(int argc, char *argv) (

if (argc != 4) (

printf("잘못된 프로그램 시작 매개변수입니다!\n");

k = atoi(argv); // 숫자 매개변수 변환

printf("안녕하세요, %d년 %s 그룹의 %s",

프로그램 이름이 task이고 이름이 첫 해부터 그룹 "PM-11"인 "Vasya"인 경우 프로그램을 시작하려면 명령줄에 입력해야 합니다.

작업 Vasya PM-11 1

프로그램을 실행하면 화면에 다음과 같은 메시지가 나타납니다: “안녕하세요, PM-11 1학년 그룹의 Vasya.”

모든 명령줄 인수가 제공되지 않으면 오류 메시지가 표시됩니다. 명령줄 인수를 사용하는 프로그램은 종종 다음을 수행합니다. 사용자가 필수 정보를 입력하지 않고 이러한 프로그램을 실행하면 인수를 올바르게 지정하는 방법에 대한 지침이 표시됩니다.

명령줄 인수는 공백으로 구분해야 합니다. 인수 자체에 공백이 있는 경우 여러 인수를 만드는 것을 방지하려면 이 인수를 큰따옴표로 묶어야 합니다. 결과적으로 인용된 전체 문자열은 하나의 인수로 간주됩니다. 예를 들어, 프로그램은 다음과 같이 시작할 수 있습니다: 작업 "Vasya and Petya" PM-21 2. 프로그램을 실행하면 화면에 다음 메시지가 나타납니다. "안녕하세요, Vasya and Petya from 2학년 PM- 21그룹.”

char *argv란 무엇입니까? 이것 요소가 포인터인 배열, 그건 포인터 배열. 이는 매개변수를 main()에 전달할 때 다음과 같이 정의할 수 있음을 의미합니다.

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

일. 모든 명령줄 인수를 표시합니다(프로그램 이름을 표시할 필요 없음).

#포함하다

void main(int argc, char *argv)(

(i = 1; 나는< argc; i++)

printf("%s\n", argv[i]);

두 번째 옵션 ================

#포함하다

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

while((p=*argv) != NULL) (

printf("%s\n", p);

일반적으로 명령줄 인수는 프로그램을 시작할 때 필요한 초기 데이터를 프로그램에 제공하는 데 사용됩니다. 예를 들어 명령줄 인수는 파일 이름이나 프로그램 시작 매개변수와 같은 데이터를 전달하는 경우가 많습니다.

프로그램에 명령줄 매개변수가 필요하지 않은 경우 main() 함수는 매개변수 목록에서 void 키워드를 사용합니다(또는 단순히 아무것도 지정하지 않습니다).

디버깅 방법 기원전 명령줄 인수가 필요한 프로그램. 실행→인수... 메뉴에서 명령줄 인수를 입력해야 합니다. 프로그램 이름을 지정할 필요가 없습니다. 그러면 평소처럼 개발 환경에서 프로그램을 실행하고 디버깅할 수 있습니다.

이 사이트에서 AdBlock을 일시중지해 주세요.

그렇다면 왜 맞춤 기능이 필요한가요? 프로그래머가 프로그램을 더 쉽게 작성하려면 사용자 정의 함수가 필요합니다.

우리는 프로그래밍 패러다임, 더 정확하게는 구조화된 프로그래밍에 대해 이야기했다는 것을 기억하십시오. 주요 아이디어는 추적, 조건 및 루프의 세 가지 기본 구성만 사용하여 모든 프로그램을 작성할 수 있다는 것입니다. 이제 우리는 이러한 구조에 "서브루틴"을 하나 더 추가하고 새로운 패러다임을 얻을 것입니다. 절차적 프로그래밍".

유일한 차이점은 메인 프로그램의 개별 부분(특히 반복되는 부분)을 별도의 함수(서브루틴, 프로시저)의 형태로 작성하고 필요에 따라 호출한다는 것입니다. 기본적으로 프로그램은 이제 다양한 기능의 상호 작용을 설명합니다.

따라서 이 튜토리얼에서는 함수가 내부적으로 어떻게 구축되는지 자세히 논의할 것입니다. 또한 사용자 정의 함수를 만드는 방법도 알아봅니다.

기능 작동 방식

첫 번째 수업의 정보를 기억해 봅시다. 사용자가 작성한 기능을 포함한 모든 기능은 비슷한 방식으로 배열됩니다. 여기에는 함수 헤더와 함수 본문이라는 두 가지 주요 부분이 있습니다.

목록 1.

Int main(void)( // 함수 헤더 // 함수 본문은 중괄호로 작성됩니다.)

함수 본문을 보면 모든 것이 명확합니다. 함수의 알고리즘을 설명합니다. 제목을 살펴보자. 이는 세 가지 필수 부분으로 구성됩니다.

  • 반환 유형;
  • 함수 이름;
  • 함수 인수.

먼저 반환 유형은 main 함수와 마찬가지로 int 와 같이 작성됩니다. 함수가 프로그램에 어떤 값도 반환하지 않아야 하는 경우 이 위치에 void 키워드가 기록됩니다. 함수가 아무것도 반환하지 않으므로 아무것도 작성할 필요가 없는 것 같습니다. 그런데 이전에는 C 언어로 수행되었지만 통일성을 위해 추가했습니다. 요즘 최신 컴파일러는 반환 유형을 지정하지 않으면 경고/오류를 발행합니다.
일부 프로그래밍 언어에서는 값을 반환하지 않는 함수를 프로시저라고 합니다(예: Pascal). 게다가 함수와 프로시저를 생성하는 데는 다양한 구문이 있습니다. C 언어에는 그러한 차별이 없습니다.

함수 이름은 반환 유형 뒤에 작성됩니다. 이름 뒤에는 함수에 전달되는 인수의 유형과 개수가 표시됩니다.

우리에게 이미 익숙한 기능의 제목을 살펴보겠습니다.

목록 2.

// 정수를 취하는 srand라는 함수는 아무것도 반환하지 않습니다. void srand(int) // 실수 float를 취하는 sqrt라는 함수는 float를 반환합니다. float sqrt(float) // 인수를 취하지 않는 rand라는 함수는 정수를 반환합니다. int rand(void) // double 유형의 두 인수를 취하는 pow라는 함수는 double 유형의 실수를 반환합니다. double pow(double, double)

자신만의 함수를 만드는 방법

자신만의 기능을 만들려면 해당 기능을 완벽하게 설명해야 합니다. 여기에는 일반 규칙이 적용됩니다. 사용하기 전에 작동 방식을 선언하고 설명하세요. 이를 위해 첫 번째 강의에서 배웠던 C 언어 프로그램 구조 다이어그램으로 돌아가 보겠습니다. 기능을 설명할 수 있는 위치를 표시해 보겠습니다.

그림 1. 프로그램 구조의 설명. 함수 선언.

보시다시피, 이 작업을 수행할 수 있는 곳은 두 곳입니다.

두 숫자의 최대값을 계산하는 사용자 정의 함수를 만드는 방법을 보여주는 예를 살펴보겠습니다.

목록 3.

#포함하다 // max_num이라는 사용자 정의 함수 선언 // 입력: a와 b라는 두 개의 정수 매개변수 // 출력: 두 인수 중 최대값 int max_num(int a, int b)( int max = b; if (a > b) max = a; return max; ) //주 프로그램 int main(void) ( int x = 0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num( x ,y); printf("max(%d,%d) = %d\n",x,y,m); 0을 반환; )

이 프로그램이 어떻게 작동하는지 자세히 설명하겠습니다. main 함수의 본문이 실행됩니다. 정수 변수 x, y 및 m이 생성됩니다. 변수 x와 y는 키보드에서 읽습니다. 3 5를 입력하고 x = 3, y = 5를 입력했다고 가정해 보겠습니다. 이 모든 것이 당신에게 분명할 것입니다. 이제 다음 줄

목록 4.

M = max_num(x,y);

변수 m은 = 기호 오른쪽에 할당되어야 합니다. 거기에는 우리가 직접 만든 함수의 이름이 있습니다. 컴퓨터는 이 함수의 선언과 설명을 찾습니다. 위에 위치해 있습니다. 이 선언에 따르면 이 함수는 두 개의 정수 값을 허용해야 합니다. 우리의 경우 변수 x와 y에 쓰여진 값입니다. 저것들. 숫자 3과 5. 함수에 전달되는 것은 변수 x와 y 자체가 아니라 그 안에 저장되는 값(두 숫자)뿐이라는 점에 유의하세요. 프로그램에서 함수가 호출될 때 실제로 함수에 전달되는 것을 함수의 실제 매개변수라고 합니다.

이제 max_num 함수가 실행되기 시작합니다. 첫 번째 단계는 함수 헤더에 설명된 각 매개변수에 대해 별도의 임시 변수를 만드는 것입니다. 우리의 경우에는 a와 b라는 두 개의 정수 변수가 생성됩니다. 이러한 변수에는 실제 매개변수의 값이 할당됩니다. 함수 헤더에 설명된 매개변수 자체를 형식 매개변수라고 합니다. 따라서 형식 매개변수 a와 b에는 각각 실제 매개변수 3과 5의 값이 할당됩니다. 이제 a = 3, b = 5입니다. 함수 내부에서는 이러한 변수를 마치 일반 변수인 것처럼 사용할 수 있습니다.

max라는 정수 변수가 생성되고 b 값이 할당됩니다. 다음으로 a > b 조건을 확인합니다. true인 경우 max 변수의 값을 .

다음은 호출 프로그램(메인 함수)에 max 변수에 기록된 값을 반환하는 return 문입니다. 5 . 그 후 변수 a, b 및 max가 메모리에서 제거됩니다. 그리고 우리는 라인으로 돌아갑니다

목록 5.

M = max_num(x,y);

max_num 함수는 값 5를 반환했습니다. 이는 이제 = 기호 오른쪽에 5가 기록되었음을 의미합니다. 이 값은 변수 m에 기록됩니다. 그런 다음 해당 행이 화면에 표시되고 프로그램이 종료됩니다.

프로그램 작동 방식을 완전히 이해하려면 마지막 4문단을 다시 주의 깊게 읽어보세요.

그동안 기능 설명의 하위 블록이 필요한 이유를 알려 드리겠습니다. 프로그램에 20개의 작은 함수를 작성했다고 상상해 보세요. 그리고 그것들은 모두 주요 기능 앞에 설명되어 있습니다. 오랫동안 메인 프로그램에 접속하는 것은 그리 편리하지 않습니다. 이 문제를 해결하기 위해 하위 블록에 기능을 설명할 수 있습니다.

그러나 전체 기능 코드를 단순히 거기로 전송하는 것은 불가능합니다. 그러면 규칙이 깨질 것입니다. 무언가를 사용하기 전에 먼저 선언해야 합니다. 이 문제를 방지하려면 함수 프로토타입을 사용해야 합니다.

함수 프로토타입은 함수 헤더와 그 뒤에 오는 ;를 완전히 반복합니다. . 위쪽 블록에 프로토타입을 지정하면 아래쪽 블록에서 이미 기능을 완전히 설명할 수 있습니다. 위의 예에서는 다음과 같을 수 있습니다.

목록 6.

#포함하다 int max_num(int, int); int main(void) ( int x =0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num(x,y); printf("max(%d ,%d) = %d\n",x,y,m); 0 반환; ) int max_num(int a, int b)( int max = b; if (a > b) max = a; 최대 반환; )

모든 것이 매우 간단합니다. 함수 프로토타입은 형식 매개변수의 이름을 지정할 필요가 없으며 단순히 해당 유형을 나타내는 것으로 충분합니다. 위의 예에서는 정확히 그렇게 했습니다.