Borland C++는 세 가지 main() 인수를 지원합니다. 처음 두 가지는 전통적인 argc와 argv입니다. 이것이 유일한 주장이다. 주요 기능(), ANSI C 표준에 의해 정의되며 명령줄 인수를 프로그램에 전달할 수 있습니다. 명령줄 인수는 프로그램 이름 뒤에 오는 정보입니다. 명령줄 운영 체제. 예를 들어 프로그램이 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 disp, 개수;
if(argc<2)
{
printf("수를 입력해야 합니다\n");
printf("명령줄에서. 다시 시도하십시오.\n");
반환 1;
}
if (argc==3 && !strcmp(argv,"디스플레이")) disp = 1;
그렇지 않으면 disp = 0;
for(count=atoi(argv); count; -count)
if (disp) printf("%d", 개수);
printf("%c", "\a"); /* 대부분의 컴퓨터에서 이것은 호출입니다 */
반환 0;
}

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

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

#포함
int main(int argc, char *argv)
{
정수, 나는;
for(t=0; t {
나는 = 0;
동안(argv[t][i])
{
printf("%c", 인수[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)
{
등록 int i;
printf("%d개의 파일이 지정된 이름과 일치합니다\n", argc-1);
printf("그들은: ");
for(i=1; 나는 printf("%s", 인수[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", 환경[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], "경로"))
printf("%s\n", 환경[t]);
}
반환 0;
}

C++ 프로그래밍 언어로 콘솔 응용 프로그램을 만들 때 다음과 매우 유사한 줄이 자동으로 생성됩니다.

int main(int argc, char* argv) // main() 함수 매개변수

이 라인은 메인 함수 main() 의 헤더이며, 매개변수 argс 및 argv는 대괄호 안에 선언되어 있습니다. 따라서 프로그램이 명령줄을 통해 실행되면 argc 및 argv 매개변수가 있으므로 이 프로그램에 모든 정보를 전송할 수 있습니다. argc 매개변수는 데이터 유형이 int 이며 주 함수에 전달된 매개변수 수를 포함합니다. 더욱이, argc는 함수의 이름이 첫 번째 매개변수로 간주되기 때문에 정보를 전달하지 않더라도 항상 최소 1입니다. argv 매개변수는 문자열에 대한 포인터의 배열입니다. 문자열 유형 데이터만 명령줄을 통해 전달할 수 있습니다. 포인터와 문자열은 별도의 섹션이 생성된 두 가지 큰 주제입니다. 따라서 모든 정보가 전송되는 것은 argv 매개변수를 통해서입니다. Windows 명령줄을 통해 실행하고 일부 정보를 전달할 프로그램을 개발해 보겠습니다.

// argc_argv.cpp: 콘솔 애플리케이션의 진입점을 지정합니다. #include "stdafx.h" #include 네임스페이스 std 사용 int main(int argc, char* argv) ( if (argc ><< argv<

// 코드 코드::블록

// Dev-C++ 코드

// argc_argv.cpp: 콘솔 애플리케이션의 진입점을 지정합니다. #포함 네임스페이스 std 사용 int main(int argc, char* argv) ( if (argc > 1)// 인수를 전달하면 argc는 1보다 클 것입니다(인수 수에 따라 다름) ( cout<< argv<

프로그램을 디버깅한 후 Windows 명령줄을 열고 프로그램 실행 파일을 명령줄 창으로 드래그하면 프로그램의 전체 경로가 명령줄에 표시됩니다(그러나 프로그램 경로를 수동으로 쓸 수 있음). 누를 수 있는 입력하다프로그램이 시작됩니다(그림 1 참조).

그림 1 - 주요 기능의 매개변수

방금 프로그램을 실행하고 인수를 전달하지 않았기 때문에 Not arguments 메시지가 나타납니다. 그림 2는 명령줄을 통해 동일한 프로그램을 실행하지만 Open 인수가 전달된 것을 보여줍니다.

그림 2 - 주 함수의 매개변수

인수는 Open 이라는 단어인데, 그림에서 알 수 있듯이 이 단어가 화면에 나타납니다. 여러 매개변수를 쉼표로 구분하여 한 번에 전달할 수 있습니다. 여러 단어로 구성된 매개변수를 전달해야 하는 경우 큰따옴표로 묶어야 하며 이러한 단어는 하나의 매개변수로 간주됩니다. 예를 들어, 그림은 프로그램의 시작을 보여주고 두 단어로 구성된 인수를 전달합니다 - It work .

그림 3 - 주요 기능의 매개변수

그리고 따옴표를 제거하면. 그러면 It이라는 단어만 보게 될 것입니다. 프로그램을 시작할 때 정보를 전달할 계획이 없으면 main() 함수에서 인수를 제거하고 이러한 인수의 이름을 변경할 수도 있습니다. 때때로 argc 및 argv 매개변수가 수정되지만 모두 생성되는 애플리케이션 유형 또는 개발 환경에 따라 다릅니다.

C++ 프로그래밍 언어로 콘솔 응용 프로그램을 자동으로 생성할 때 다음과 매우 유사한 기본 함수가 자동으로 생성됩니다.

int main(int argc, char * argv)
{…}

함수 헤더에는 argc 및 argv 인수가 있는 메인 함수 main()의 서명이 포함되어 있습니다.
프로그램이 명령줄을 통해 실행되면 이 프로그램으로 모든 정보를 전송할 수 있습니다. 이를 위한 명령줄 인수 argc 및 argv가 있습니다.
argc 매개변수는 int 유형이며 주 함수에 전달된 매개변수 수를 포함합니다. 게다가 argc는 애플리케이션 이름이 첫 번째 매개변수로 간주되기 때문에 주 함수에 정보가 전달되지 않는 경우에도 항상 최소 1입니다.
argv 매개변수는 문자열에 대한 포인터의 배열입니다. 문자열 유형 데이터만 명령줄을 통해 전달할 수 있습니다.

Windows 명령줄을 통해 프로그램을 실행할 때 일부 정보를 전달할 수 있습니다. 이 경우 명령줄은 다음과 같습니다.
드라이브:\경로\이름.exe 인수1 인수2 ...

명령줄 인수는 하나 이상의 공백으로 구분됩니다.

argv 인수에는 정규화된 애플리케이션 이름이 포함됩니다.

#포함
네임스페이스 std 사용

쫓다<< argv << endl;

반환 0;
}

실행 결과

예 : 두 정수의 곱 계산
프로그램은 여기에서 문자열을 정수로 변환하는 함수 StrToInt()를 사용합니다.

#포함
네임스페이스 std 사용
int StrToInt(char*s) (…)
int main(int argc, char * argv) (

정수 a = 0, b = 0;

만약 (argc > 1)

a = StrToInt(argv);

만약 (argc > 2)

b = StrToInt(argv);

쫓다<< a <<«*» << b << «= « << a*b << endl;

반환 0;
}

프로그램은 다음과 같이 시작됩니다.

실행 결과

명령줄 인수로 프로그램 디버깅

프로그램을 디버깅할 때 명령줄 인수를 전달하려면 메뉴에 액세스해야 합니다. 속성프로젝트.


탭에서 구성 속성 -> 디버그선택하다 명령 인수값을 설정합니다.

디버그 모드에서 프로그램을 실행할 때 입력한 인수는 프로그램에서 명령줄 인수로 처리됩니다.

특정 인수를 C 프로그램에 전달할 수 있습니다. 계산 시작 시 main()이 호출되면 세 개의 매개변수가 여기에 전달됩니다. 첫 번째는 프로그램에 액세스할 때 명령 인수의 수를 결정합니다. 두 번째 것은 이러한 인수를 포함하는 문자열에 대한 포인터 배열입니다(문자열당 하나의 인수). 세 번째는 또한 문자열에 대한 포인터 배열이며 운영 체제 매개변수(환경 변수)에 액세스하는 데 사용됩니다.

이러한 행은 다음과 같이 표시됩니다.

변수 = 값\0

마지막 줄은 두 개의 후행 0으로 찾을 수 있습니다.

main() 함수 인수의 이름을 각각 argc, argv 및 env로 지정합시다(다른 이름도 가능). 그런 다음 다음 설명이 허용됩니다.

메인(int argc, char *argv)

메인(int argc, char *argv, char *env)

A: 드라이브에 prog.exe 프로그램이 있다고 가정합니다. 다음과 같이 처리해 보겠습니다.

A:\>prog.exe 파일1 파일2 파일3

그런 다음 argv는 문자열 A:\prog.exe에 대한 포인터이고 argv는 문자열 file1에 대한 포인터입니다. 첫 번째 실제 인수는 argv가 가리키고 마지막 인수는 argv로 가리킵니다. argc=1이면 명령줄에서 프로그램 이름 뒤에 매개변수가 없습니다. 이 예에서는 argc=4입니다.

재귀

재귀는 함수가 자신을 호출하는 호출 방법입니다.

재귀 프로그램을 컴파일할 때 중요한 점은 출구 구성입니다. 함수가 지속적으로 자신을 무한정 호출한다는 실수를 하기 쉽습니다. 따라서 재귀 프로세스는 단계적으로 문제를 단순화하여 결국에는 비재귀적 솔루션이 나타나도록 해야 합니다. 재귀를 사용하면 스택 오버플로가 발생할 수 있으므로 항상 바람직한 것은 아닙니다.

라이브러리 기능

프로그래밍 시스템에서 일반적인 문제를 해결하기 위한 서브루틴은 라이브러리로 결합됩니다. 이러한 작업에는 수학 함수 계산, 데이터 입력/출력, 문자열 처리, 운영 체제 도구와의 상호 작용 등이 포함됩니다. 라이브러리 루틴을 사용하면 적절한 도구를 개발할 필요가 없고 사용자에게 추가 서비스를 제공합니다. 라이브러리에 포함된 기능은 프로그래밍 시스템과 함께 제공됩니다. 그들의 선언은 *.h 파일에 제공됩니다(이들은 소위 포함 또는 헤더 파일입니다). 따라서 위에서 언급했듯이 라이브러리 함수가 있는 프로그램의 시작 부분에는 다음과 같은 줄이 있어야 합니다.

#포함<включаемый_файл_типа_h>

예를 들어:

#포함

사용자 프로그램으로 새 라이브러리를 확장하고 생성하는 기능도 있습니다.

전역 변수는 프로그램 기간 동안 메모리에서 고정된 위치에 할당됩니다. 지역 변수는 스택에 저장됩니다. 그들 사이에는 동적 할당을 위한 메모리 영역이 있습니다.

malloc() 및 free() 함수는 여유 메모리를 동적으로 할당하는 데 사용됩니다. malloc() 함수는 메모리를 할당하고 free() 함수는 메모리를 해제합니다. 이러한 함수의 프로토타입은 stdlib.h 헤더 파일에 저장되며 다음과 같습니다.

무효 *malloc(size_t 크기);

무효 *자유(무효 *p);

malloc() 함수는 void 유형의 포인터를 반환합니다. 적절한 사용을 위해 함수 값은 적절한 유형에 대한 포인터로 변환되어야 합니다. 성공하면 함수는 크기 크기의 여유 메모리의 첫 번째 바이트에 대한 포인터를 반환합니다. 메모리가 충분하지 않으면 0 값을 반환하고 sizeof() 연산을 사용하여 변수에 필요한 바이트 수를 결정합니다.

이러한 기능을 사용하는 예:

#포함

#포함

p = (int *) malloc(100 * sizeof(int)); /* 100에 대한 메모리 할당

정수 */

printf("메모리 부족\n");

(나는 = 0; 나는< 100; ++i) *(p+i) = i; /* Использование памяти */

(나는 = 0; 나는< 100; ++i) printf("%d", *(p++));

무료(p); /* 여유 메모리 */

malloc()에 의해 반환된 포인터를 사용하기 전에 메모리가 충분한지 확인해야 합니다(포인터가 null이 아님).

전처리기

C 전처리기는 컴파일러에 대한 입력을 처리하는 프로그램입니다. 전처리기는 소스 프로그램을 보고 다음 작업을 수행합니다. 주어진 파일을 여기에 연결하고, 대체를 수행하고, 컴파일 조건도 관리합니다. 전처리기는 # 기호로 시작하는 프로그램 행을 위한 것입니다. 한 줄에 하나의 명령(전처리기 지시문)만 허용됩니다.

지령

#define 식별자 대체

다음 프로그램 텍스트가 명명된 식별자를 대체 텍스트로 바꾸도록 합니다(이 명령 끝에 세미콜론이 없음에 유의). 기본적으로 이 지시문은 매크로 정의(매크로)를 도입합니다. 여기서 "식별자"는 매크로 정의의 이름이고 "대체"는 전처리기가 프로그램 텍스트에서 지정한 이름을 찾을 때 대체하는 문자 시퀀스입니다. 매크로 이름은 일반적으로 대문자로 표시됩니다.

예를 고려하십시오.

첫 번째 줄은 프로그램이 식별자 MAX를 상수 25로 바꾸도록 합니다. 두 번째 줄은 텍스트에서 여는 중괄호(() 대신 단어 BEGIN을 사용할 수 있도록 합니다.

전처리기는 매크로 정의의 기호 이름과 사용되는 컨텍스트 간의 호환성을 확인하지 않으므로 이러한 식별자는 #define 지시문이 아닌 명시적 유형의 const 키워드로 정의하는 것이 좋습니다. 표시(C ++의 경우 더 그렇습니다):

상수 정수 MAX = 25;

(int 유형은 기본적으로 설정되어 있으므로 생략할 수 있습니다.)

#define 지시문이 다음과 같은 경우:

#define 식별자(식별자, ..., 식별자) ​​대체

첫 번째 식별자와 여는 괄호 사이에 공백이 없으면 인수가 있는 매크로 대체 정의입니다. 예를 들어 다음과 같은 줄이 나타난 후:

#define READ(val) scanf("%d", &val)

문 READ(y); scanf("%d",&y);와 동일하게 처리됩니다. 여기서 val은 인수이고 매크로 대체는 인수로 수행됩니다.

다음 줄에 계속되는 대체에 긴 정의가 있는 경우 \ 문자는 다음 연속 줄 끝에 배치됩니다.

매크로 정의에서 ## 문자로 구분된 개체를 배치할 수 있습니다. 예를 들면 다음과 같습니다.

#PR(x, y) x##y 정의

그 후, PR(a, 3)은 치환을 a3이라고 부를 것입니다. 또는 예를 들어 매크로 정의

#define z(a, b, c, d) a(b##c##d)

z(sin, x, +, y)를 sin(x+y)로 변경합니다.

매크로 인수 앞에 있는 # 문자는 문자열로 변환되었음을 나타냅니다. 예를 들어 지시문 뒤에

#define PRIM(var) printf(#var"= %d", var)

프로그램 텍스트의 다음 조각

다음과 같이 변환됩니다.

printf("연도""= %d", 연도);

다른 전처리기 지시문에 대해 설명하겠습니다. #include 지시문은 전에 본 적이 있습니다. 두 가지 형태로 사용할 수 있습니다.

#include "파일 이름"

#포함<имя файла>

두 명령의 효과는 지정된 이름의 파일을 프로그램에 포함시키는 것입니다. 첫 번째는 현재 디렉토리 또는 접두사로 지정된 디렉토리에서 파일을 로드합니다. 두 번째 명령은 프로그래밍 시스템에 정의된 표준 위치에서 파일을 검색합니다. 이름이 큰따옴표로 묶인 파일이 지정된 디렉토리에 없으면 #include 명령에 지정된 하위 디렉토리에서 검색이 계속됩니다.<...>. #include 지시문은 서로 중첩될 수 있습니다.

다음 지시문 그룹을 사용하면 프로그램의 일부를 선택적으로 컴파일할 수 있습니다. 이 프로세스를 조건부 컴파일이라고 합니다. 이 그룹에는 #if, #else, #elif, #endif, #ifdef, #ifndef 지시문이 포함됩니다. #if 지시문의 기본 형식은 다음과 같습니다.

#if constant_expression statement_sequence

여기서 상수 표현식의 값이 확인됩니다. 참이면 주어진 명령문 시퀀스를 실행하고 거짓이면 이 명령문 시퀀스를 건너뜁니다.

#else 지시문의 동작은 C 언어의 else 명령의 동작과 유사합니다. 예를 들면 다음과 같습니다.

# 상수 표현식인 경우

문_시퀀스_2

여기서 상수 표현식이 참이면 sequence_of_operators_1이 실행되고 거짓이면 sequence_of_operators_2가 실행된다.

#elif 지시문은 "else if" 유형 작업을 의미합니다. 주요 사용 형태는 다음과 같습니다.

# 상수 표현식인 경우

statement_sequence

#elif 상수 표현식_1

문_시퀀스_1

#elif 상수 표현식_n

sequence_of_statements_n

이 형식은 다음 형식의 C 언어 구성과 유사합니다. if...else if...else if...

지령

#ifdef 식별자

지정된 식별자가 현재 정의되어 있는지 여부를 설정합니다. #define 형식의 지시문에 포함되었는지 여부. 뷰 라인

#ifndef 식별자

지정된 식별자가 현재 정의되지 않았는지 확인합니다. 이러한 지시문 뒤에는 #else 문(#elif는 사용할 수 없음)을 포함하고 #endif 줄로 끝나는 임의의 수의 텍스트 행이 올 수 있습니다. 검사 중인 조건이 참이면 #else와 #endif 사이의 모든 행이 무시되고, 거짓이면 검사와 #else 사이의 행이 무시됩니다(#else 단어가 없으면 #endif). #if 및 #ifndef 지시문은 서로 중첩될 수 있습니다.

지시문 보기

#undef 식별자

지정된 식별자가 정의되지 않은 것으로 간주되도록 합니다. 교체 불가.

예를 고려하십시오. 세 가지 지시문은 다음과 같습니다.

식별자 WRITE가 정의되었는지 확인하고(예: #define WRITE... 형식의 명령) 그렇다면 WRITE 이름은 정의되지 않은 것으로 간주됩니다. 교체 불가.

지시

#define 쓰기 fprintf

WRITE 식별자가 정의되지 않았는지 확인하고, 정의되지 않은 경우 fprintf 이름 대신 WRITE 식별자가 결정됩니다.

#error 지시문은 다음 형식으로 작성됩니다.

#오류 error_message

프로그램 텍스트에서 발생하면 컴파일이 중지되고 디스플레이 화면에 오류 메시지가 표시됩니다. 이 명령은 주로 디버그 단계에서 사용됩니다. 오류 메시지는 큰따옴표로 묶을 필요가 없습니다.

#line 지시문은 C 프로그래밍 시스템에 정의된 _LINE_ 및 _FILE_ 변수의 값을 변경하기 위한 것입니다. _LINE_ 변수에는 현재 실행 중인 프로그램의 줄 번호가 포함됩니다. _FILE_ 식별자는 컴파일 중인 프로그램 이름이 있는 문자열에 대한 포인터입니다. #line 지시문은 다음과 같이 작성됩니다.

#줄 번호 "파일 이름"

여기서 number는 _LINE_ 변수에 할당될 양의 정수이고, filename은 _FILE_ 값을 무시하는 선택적 매개변수입니다.

#pragma 지시문을 사용하면 일부 명령을 컴파일러에 전달할 수 있습니다. 예를 들어, 라인

C 프로그램에 어셈블리 언어 문자열이 있음을 나타냅니다. 예를 들어:

일부 전역 식별자 또는 매크로 이름(매크로 정의의 이름)을 고려하십시오. 5개의 이러한 이름이 정의됩니다: _LINE_, _FILE_, _DATE_, _TIME_, _STDC_. 그 중 두 개(_LINE_ 및 _FILE_)는 이미 위에서 설명했습니다. _DATE_ 식별자는 소스 파일이 개체 코드로 변환된 날짜를 저장하는 문자열을 지정합니다. _TIME_ 식별자는 소스 파일이 개체 코드로 변환된 시간을 저장하는 문자열을 지정합니다. 표준 정의 매크로 이름이 사용되는 경우 _STDC_ 매크로의 값은 1입니다. 그렇지 않으면 이 변수가 정의되지 않습니다.

데이터가 호출될 때 명령줄에서 프로그램으로 전송되는 경우가 발생합니다. 이러한 데이터를 명령줄 인수라고 합니다. 예를 들어 다음과 같습니다.

./a.out test.txt ls -lt /home/peter/

이것은 프로그램 a.out(현재 디렉토리에서) 및 ls(PATH 환경 변수에 지정된 동일한 디렉토리에서)를 호출합니다. 명령줄의 첫 번째 프로그램은 test.txt라는 단어를, 두 번째 프로그램은 -lt 및 /home/peter/라는 단어를 받습니다.

프로그램이 C로 작성된 경우 시작될 때 제어가 즉시 main() 함수로 전달되므로 변수 매개변수에 할당된 명령줄 인수를 받는 사람은 바로 그녀입니다.

지금까지 우리는 매개변수를 받지 않고 아무 것도 반환하지 않는 것처럼 main() 함수를 정의했습니다. 사실, C에서 기본적으로 모든 함수(다른 것이 정의되지 않은 경우)는 정수를 반환합니다. 이것은 확인할 수 있습니다. 다음과 같이 코드를 작성하면:

main() ( printf("안녕하세요. \N") ; 0 반환 ; )

그러면 컴파일 중에 경고나 오류가 발생하지 않습니다. int main() 을 작성하는 경우에도 마찬가지입니다. 이것은 기본 함수가 정수를 반환하고 아무것도 반환하지 않는다는 것을 증명합니다(void). 함수가 반환하는 것은 항상 "재정의"될 수 있지만, 예를 들어 voidmain() 또는 float main() 입니다.

프로그램이 명령줄에서 호출되면 한 쌍의 데이터가 항상 프로그램에 전달됩니다.

  1. 정수, 호출될 때 명령줄의 단어 수(공백으로 구분된 요소)를 나타냅니다.
  2. 문자열 배열에 대한 포인터, 여기서 각 줄은 명령줄의 한 단어입니다.

프로그램 이름 자체도 고려됩니다. 예를 들어 호출이 다음과 같은 경우:

./a.out 12 테마 2

그런 다음 프로그램의 첫 번째 인수는 4이고 문자열 배열은 ("./a.out", "12", "theme", "2")로 정의됩니다.

용어에 주의하십시오. 프로그램 인수는 두 개(숫자와 배열)뿐이지만 명령줄 인수는 원하는 만큼 많습니다. 명령줄 인수는 프로그램 인수(main() 함수에 대한 인수로)로 "변환"됩니다.
이 데이터(숫자 및 포인터)는 프로그램에 아무 것도 전달하지 않고 단순히 이름으로 호출되는 경우에도 프로그램에 전달됩니다: ./a.out. 이 경우 첫 번째 인수는 1이고 두 번째 인수는 하나의 문자열(""./a.out")의 배열을 가리킵니다.

데이터가 프로그램에 전달된다는 사실이 main() 함수가 데이터를 수신해야 한다는 것을 의미하지는 않습니다. main() 함수가 매개변수 없이 정의되면 명령줄 인수에 액세스할 수 없습니다. 당신이 그들을 보내는 것을 막는 것은 없지만. 오류가 발생하지 않습니다.

프로그램에 전달된 데이터에 액세스하려면 변수에 할당해야 합니다. 인수는 즉시 main() 에 전달되므로 헤더는 다음과 같아야 합니다.
메인(int n, char *arr)

첫 번째 변수(n)에는 단어 수가 포함되고 두 번째 변수에는 문자열 배열에 대한 포인터가 포함됩니다. 종종 두 번째 매개변수는 **arr 로 작성됩니다. 그러나 동일합니다. 문자열 배열 자체에는 문자열에 대한 포인터가 요소로 포함되어 있음을 기억하십시오. 그리고 함수에서 배열의 첫 번째 요소에 대한 포인터를 전달합니다. 포인터에 대한 포인터를 전달하는 것으로 나타났습니다. **아.

운동
다음과 같은 프로그램을 작성하십시오.

#포함 int main(int argc, char ** argv) ( int i; printf("%d \N", 인수) ; (i= 0 ; 나는< argc; i++ ) puts (argv[ i] ) ; }

호출될 때 명령줄에 있는 단어 수를 인쇄하고 새 줄에 각 단어를 인쇄합니다. 명령줄 인수 없이 인수를 사용하여 호출합니다.

프로그램에서 변수 매개변수 argc 및 argv를 사용했습니다. 그러한 이름을 사용하는 것이 일반적이지만 실제로는 무엇이든 될 수 있습니다. 귀하의 프로그램이 귀하뿐만 아니라 다른 프로그래머도 더 잘 이해할 수 있도록 이 표준을 준수하는 것이 좋습니다.

프로그램에 데이터 전달의 실질적인 중요성

GNU/Linux 명령줄에 대한 경험이 있다면 대부분의 명령에 스위치와 인수가 있다는 것을 알고 있습니다. 예를 들어, 디렉토리의 내용을 볼 때 복사, 이동, 명령이 실행되는 파일 시스템 개체를 인수로 지정합니다. 구현 기능은 키를 사용하여 결정됩니다. 예를 들어 명령에서

Cp -r ../les_1 ../les_101

cp는 명령의 이름이고 -r은 스위치이며 ../les_1 및 ../les_101은 명령 인수입니다.

일반적으로 대부분의 경우 프로그램이 실행될 때 프로그램 실행 프로세스의 파일 주소와 "수정자"(키)가 전송됩니다.

쓰기 또는 추가를 위해 명령줄에서 사용자가 지정한 파일을 열고 사용자가 프로그램 실행 중에 키보드에서 입력하는 것과 동일한 정보를 기록(추가)하는 프로그램을 작성해 보겠습니다.

#포함 #포함 main (int argc, char ** argv) ( int i, ch; FILE * f[ 5 ] ; if (argc< 3 || argc >7 ) ( 넣다 ( "잘못된 매개변수 수") ; 반환 1 ; ) if (strcmp (argv[ 1 ] , "-w" ) != 0 && strcmp (argv[ 1 ] , "-a" ) != 0 ) ( "첫 번째 매개변수는 -w 또는 -a일 수 있습니다.") ; 반환 2 ; ) (i= 0 ; 나는< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("%s 파일을 열 수 없습니다.\n ", 인수v[ i+ 2 ] ) ; 반환 3 ; ) ) 동안 ((ch = getchar() ) != EOF) for (i= 0 ; i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

코드에 대한 설명:

  1. 5개의 파일 포인터 배열이 생성됩니다. 따라서 동시에 5개 이상의 파일을 열 수 없습니다. 첫 번째 파일의 파일 포인터는 배열 요소 f에 저장되고 두 번째 파일은 f에 저장되는 식입니다.
  2. 명령줄 인수의 수가 확인됩니다. 적어도 세 개는 있어야 하기 때문입니다. 첫 번째는 프로그램의 이름이고, 두 번째는 파일 열기 모드이고, 세 번째는 쓸 첫 번째 또는 유일한 파일입니다. 프로그램에서 5개의 파일만 열 수 있으므로 명령줄 인수의 총 수는 7개를 초과할 수 없습니다. 따라서 인수의 수가 3보다 작거나 7보다 크면 프로그램이 종료됩니다. return 문은 뒤에 코드가 더 있더라도 함수가 종료되도록 합니다. 0이 아닌 함수 반환 값은 부모 프로세스에서 프로그램이 오류로 종료되었다는 메시지로 해석될 수 있습니다.
  3. 두 번째 명령줄 인수의 정확성이 확인됩니다. "-w"도 아니고 "-a"도 아닌 경우 두 번째 if의 조건식은 1(true)을 반환합니다. strcmp() 함수를 사용하면 문자열을 비교할 수 있고 같으면 0을 반환합니다.
  4. for 루프는 argv 배열의 세 번째 요소에서 시작하는 지정된 주소에서 파일을 엽니다. 이것이 i에 2를 추가하여 세 번째부터 시작하여 argv 배열의 요소를 가져오는 이유입니다. argc-2 표현식은 전달된 파일 이름의 수를 나타냅니다. 왜냐하면 argc는 명령줄 인수의 총 수를 저장하며, 그 중 처음 두 개는 파일 이름이 아닙니다.
  5. 표현식 argv+1을 사용하면 문자열 "-w"(또는 "-a")에서 하위 문자열 "w"(또는 "a")를 "잘라낼" 수 있습니다. argv는 본질적으로 문자열의 첫 번째 요소에 대한 포인터입니다. 포인터에 1을 추가하여 배열의 다음 요소로 이동합니다.
  6. 파일을 열 수 없으면 fopen() 함수는 NULL을 반환합니다. 이 경우 프로그램이 종료됩니다.
  7. 사용자가 키보드에서 입력한 각 문자는 열려 있는 모든 파일에 기록됩니다.
  8. 결국 파일이 닫힙니다.