type="nal"
[C언어] main 에서 입력받은 argv[1]을 정수로 바꾸는 법 본문
[C언어] main 에서 입력받은 argv[1]을 정수로 바꾸는 법
nalmi 2024. 4. 5. 18:56메인함수에서 숫자 두개를 인자로 넣어주고 싶은데 이녀석이 문자열이었다는 걸 간과하고 있었다..
*(int *)argv[1] 이렇게 역참조도 써보려 했는데 되지 않아서 다른 쉬운 방법들을 쓰기로 했다.
1. argc, argv
우선 메인함수에서 void를 사용해(비워둘 때) 매개변수를 사용하지 않을 수도 있지만,
아래와 같이 메인함수의 기본 형식은 두가지 파라미터(매개변수)를 가진다.
argc, argv를 쓰는 경우는 터미널 같은 커맨드라인 인터페이스(command-line interface), 프롬프트에서 파일을 실행할 때 인자를 전달 할 수 있도록 해준다.
argc는 프로그램을 실행했을 때 전달되는 인수의 갯수로,
만약 파일을 컴파일하고 ./a.out만 터미널에 입력해 실행하면 argc는 1이다.
실행 파일 자체도 인자에 포함되는 것이다.
argv는 포인터라서 어려워보일 수 있지만 인자들이 저장된 문자열의 주소를 갖고 있는 포인터 배열이다.
(배열도 포인터처럼 주소값을 가지기 때문에 char **argv나 char *argv[]를 쓰나 상관없다.)
argv[0]은 프로그램의 실행경로,
argv[1], argv[2] ... 얘네는 입력한 인자들이 문자열로 저장되어 있다. 배열안에 있다고 생각하면 되고 인자들을 입력할 때 띄어쓰기로 구분해줌.
위 코드를 ./a.out hello abc 123 이런식으로 인자들을 같이 입력해 실행하면
./a.out
hello
abc
123
이렇게 각각 문자열이 저장되어 있는 것을 확인할 수 있다.
참고로 argv[1][1]이렇게 이차원배열처럼 쓸수도 있긴하다.
->첫번째 인자인 hello의 1번째 인덱스인 e를 가리킴.
2. argv[1]를 숫자형태로 사용하려면(10 미만일 때)
우선 처음에 쓴 것처럼 형변환해서 역참조 안됐고..(어케 하는지 모르겠다) 일단 단순히 문자열을 숫자로 바꾸기 위해 문자열0을 빼주기로 했다.
argv에 숫자를 인자로 전달한다해도 이는 문자열로 저장된다. 2를 입력하면 정수 2가 아닌 문자열'2'가 들어있다.
이렇게 아스키코드표를 보면 '2'와 숫자 2는 일치하지 않기 때문에 '2'를 숫자로 출력하면 50이라는 값이 나온다.
그래서 '문자열'인 숫자를 '정수' 숫자로 바꾸기 위해 제일 작은 값인 48, 즉 '0'을 빼주면 원하는 숫자를 얻을 수가 있다.
인자를 2개만 받을 것이기 때문에 argc에 조건을 넣어줬다.
이때 argv는 현재 처리해야할 문자열에 대한 포인터이고,
*argv가 현재 처리해야 할 문자열이기 때문에(**argv는 현재 처리해야 할 문자열의 첫 글자)
포인터로 *argv[1] 의 값인 '2'를 가져오고, '0'을 때서 2라는 정수 값을 변수에 저장하게 된다.
다만 숫자가 10보다 커지면 '10'이 문자열에 저장되고, 하나씩 0을 빼주기는 번거로워진다.
3. atoi함수 이용하기
이런 계산이 귀찮고 복잡하다 싶으면 간단하게 문자열을 정수로 바꿔주는 함수를 이용할 수 있다.
atoi는 Ascii to Integer 말그대로 문자열(아스키코드 값)을 정수로 변환하고
<stdlib.h>를 헤더에 추가해 사용할 수 있다.
다음과 같이 문자열(배열)을 넣어주면 된다.
int atoi(const char *string);
이때 문자열의 값이 아닌 문자열 포인터(배열)을 그대로 넣어주면 되기 때문에 그냥 argv[1]을 함수의 인자로 준다.
이렇게 정수로 바꿀 수 있다.
문자열을 인자로 받기때문에 그냥 '10'이면 정수 10으로 그대로 바꿀 수 있다.
참고
아스키코드표: https://blog.naver.com/PostView.nhn?blogId=jysaa5&logNo=221831226674
argc, argv:https://bo5mi.tistory.com/165
atoi: https://www.ibm.com/docs/ko/i/7.3?topic=functions-atoi-convert-character-string-integer
'Programming Language > C Programming Language' 카테고리의 다른 글
[C언어]음식 평론가(백준 1188번) - 최대 공약수 구하는 함수 (0) | 2024.04.08 |
---|---|
[C언어] 단어 수학 (백준 1339번)-pow, Quic sort 사용 (0) | 2024.04.04 |