반응형
기본 인자에 무슨 값이 들어있는 확인하는 예제
#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인 문자열을 만들어서 넣는다면 해결할 수 있겠지만
이는 배열을 동적할당 해야하므로 아직 해결할 수 없는 문제.
*/
반응형