연재 완료/C Lang 예제코드 모음

C언어 함수 주요예제 5. (메인함수의 인수 관련 예제들)

라이피 (Lypi) 2018. 5. 18. 23:12
반응형

기본 인자에 무슨 값이 들어있는 확인하는 예제

#include <stdio.h>

int main(int argc, char *argv[],char* env[])
{
	printf("argc = %d\n", argc);
	
	for (int i = 0; i < argc; i++) {
		printf("argv[%d] = %s\n", i, argv[i]);
	}

	for (int i = 0; en[i] != NULL; i++) {
		printf("env[%d] = %s\n", i, en[i]);
	}
}


//메인함수의 매개변수를 쓰는 코드가 다 쓸데 없어 보여서 그냥 이 예제들은 열심히 쳐보기로 함.


메인함수의 매개변수로 16진수를 받아 10진수로 변환시켜 출력하는 프로그램

#include <stdio.h>
#include <string.h> //strlen(), _strupr_s()
//strlen() : 인수로 전달된 문자열의 길이를 리턴하는 함수
//_strupr_s() : 문자열을 받아 소문자를 대문자로 변환해주는 함수.

int main(int argc, char *argv[])
{
	int sqr = 16 * 16 * 16, sum = 0;

	if (argc != 2 || strlen(argv[1]) != 4) {
		printf("사용방법 : \n \t 매개변수로16진수 데이터 4자리 입력 \n");
		return 0;
	}

	// _strupr_s(argv[1],sizeof(argv[1])); 
	// 사용시 argv[1]이 널문자로 끝나지 않는다는 런타임 에러를 발생시킨다.

	for (int i = 0; i < 4; i++) {
		if (argv[1][i] >= 'A' && argv[1][i] <= 'F') {
			sum += ((argv[1][i] - 55)*sqr);
		}
		else if (argv[1][i] >= '0' && argv[1][i] <= '9') {
			sum += ((argv[1][i] - 48) * sqr);
		}
		else {
			printf("사용방법 : \n\t 매개변수로 16진수 데이터 4자리 입력 \n");
			return 0;
		}
		sqr /= 16;
	}
	printf("16진수 %s의 10진수 값은 %d입니다. \n", argv[1], sum);
}

10진수를 매개변수로 받아 약수를 출력하는 프로그램.
#include <stdio.h>
#include <stdlib.h> // atoi() 사용
//atoi() : 문자열을 int 데이터로 변환하는 함수.


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

	if (argc != 2) {
		printf("매개변수로 10진수를 입력하세요");
		return 0;
	}

	printf("input data %s \n", argv[1]);

	for (int i = 0; argv[1][i] != '\0'; i++) {
		if (argv[1][i] < '0' || argv[1][i] > '9') {
			printf("매개변수로 10진수를 입력하세요");
			return 0;
		}
	}
	//여기까지 매개변수 유효성 검사.

	x = atoi(argv[1]);
	//문자변수를 정수형으로 변환

	for (int i = 1; i <= x / 2; i++) {
		if (x%i == 0) {
			printf("%d\n", i);
		}
	}
	//약수를 구하는 코드
}

10진수 2개를 매개변수로 받아서 그 사이의 합을 구하는 프로그램
#include <stdio.h>
#include <stdlib.h> // atoi() 사용
//atoi() : 문자열을 int 데이터로 변환하는 함수.


int main(int argc, char *argv[])
{
	int sum = 0;
	int max, min;

	if (argc != 3) {
		printf("매개변수로 10진수 2개를 입력하세요 \n");
		return 0;
	}

	/*
	for (int i = 1; i < argc; i++) {
		for (int k = 0; argv[i][k] != '\0'; i++) {
			if (argv[i][k] < '0' || argv[i][k] > '9') {
				printf("매개변수로 10진수 2개를 입력하세요 \n");
				return 0;
			}
		}
	}
	//여기까지 매개변수 유효성 검사
	//vs로 보낸 매개변수의 끝에는 널문자가 없어서 위의 코드가 작동이 안된다.
	*/
	

	max = atoi(argv[1]);
	min = atoi(argv[2]);
	//10진수로 변환해서 저장

	if (max < min) {
		max ^= min; min ^= max; max ^= min;
	}
	//max가 min보다 작으면 교체.

	for (int i = min; i <= max; i++) {
		sum += i;
	}

	printf("%d ~ %d 사이의 정수들의 합 : %d \n", min, max, sum);
	//합계 계산 및 출력
}

10진수 3개를 매개변수로 받아 최대공약수를 구하는 프로그램

#include <stdio.h>
#include <stdlib.h> // atoi() 사용
//atoi() : 문자열을 int 데이터로 변환하는 함수.

int gcd(int a, int b);

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

	if (argc != 4) {
		printf("매개변수로 10진수 3개를 입력하세요. \n");
		return 0;
	}
	//매개변수 유효성 검사

	for (int i = 0; i < 3; i++) {
		num[i] = atoi(argv[i + 1]);
	}
	//문자열을 정수형으로 변경

	printf("%d, %d, %d 세 수의 최대공약수는 %d 입니다. \n",num[0],num[1],num[2], gcd(gcd(num[0], num[1]), num[2]));
	//최대공약수 계산
	
}

//유클리드 호제법을 이용해서 최대공약수를 계산하는 함수
int gcd(int a, int b)
{
	int abs_a = (a > 0) ? a : -a;
	int abs_b = (b > 0) ? b : -b;

	//gcd(0,0) = 0
	if (a == 0 && b == 0) {
		return 0;
	}
	//gcd(a,0) = a , gcd(0,b) = b
	else if (a == 0 || b == 0) {
		return a == 0 ? b : a;
	}

	if (abs_a > abs_b) {
		return abs_a % abs_b ? gcd(b, a%b) : b;
	}
	else {
		return abs_b % abs_a ? gcd(a, b%a) : a;
	}
} //앞에서 쓴 함수 재활용


실수 하나를 매개변수로 받아서 정수부와 소수부로 나눠서 출력하는 프로그램.

#include <stdio.h>
#include <stdlib.h> // atoi() 사용
//atof() : 문자열을 실수형 데이터로 변환하는 함수.

int main(int argc, char* argv[])
{
	int ip;
	double number, pp;

	if (argc != 2) {
		printf("매개변수로 실수 데이터를 입력하세요 \n");
		return 0;
	}

	for (int i = 0; argv[1][i] != '\0'; i++) {
		if ((argv[1][i] < '0' || argv[1][i] > '9') && argv[1][i] != '.') {
			printf("매개변수로 10진수를 입력하세요");
			return 0;
		}
	}
	//매개변수 유효성 검사

	number = atof(argv[1]);

	ip = (int)number;
	pp = number - (double)ip;

	printf("%lf => 정수부 : %d, 실수부 : %f \n", number, ip, pp);
}



/*

_strupr_s()함수 사용 결과를 보아 vs로 전달하는 매개변수의 마지막에는 널문자가 들어가지 않는 것으로 보인다. 

그런데 실 매개변수가 한개일 때는 널문자까지 검사하는 부분에서 오작동이 일어나지 않는다.

널문자가 들어있는 것도 아닌데 왜 아무 문제 없이 넘어가는건지는 모르겠다...

*/


/* 5.22 추가

끝에 널문자가 없다면 끝에 널문자를 넣어주면 된다는 아이디어가 떠올라서 실행해보니

argv[1]의 마지막 문자에 널문자를 넣어버리면 마지막 문자가 잘린다.  

즉, argv로 받아온 문자열에는 뒤에 널문자를 넣을 여유공간이 없다.


그러므로 argv로 받아온 문자열의 길이 +1인 문자열을 만들어서 넣는다면 해결할 수 있겠지만

이는 배열을 동적할당 해야하므로 아직 해결할 수 없는 문제.

*/

반응형