포인터 관련 기초 질문입니다.
글쓴이: jmonaco88 / 작성시간: 화, 2012/12/04 - 3:36오후
#include <stdio.h> #include <stdlib.h> #include <ctype.h> void string_up(char *p); int main(int argc, char *argv[]) { if(argc != 2){ printf("try again\n"); exit(1); } string_up(argv[1]); printf("%s\n", *argv[1] ); return 0; } void string_up(char *p) { *p = toupper(*p); }
argv 매개변수 공부중이라서요 효율적이지는 않은 코드지만 꼭 사용할려고합니다.
argv[1]에 들어온 매개변수를 toupper함수 이용해서 대문자로 만들어준뒤에
출력해주는 내용인데요
단순하게 알아보기쉽게 만들어놨는데 core dumped 오류뜨네요... 흠... 조언좀 주세요 ㅠㅠ
Forums:
...
(1) Warning 다 켜고 컴파일하세요. (gcc라면 -W -Wall)
(2) *argv[1]의 타입이 무엇일까요?
그리고 문자열의 첫 글자만 대문자로 만들면 되는 건가요?
아니요 ㅠ
모두다 대문자로 만들어야합니다 ^^
상수형 문자열과 문자열 배열을 구분할 줄 아셔야겠습니다.
1. 다음 두 문장 중 런타임 에러가 일어나는 것은 무엇일까요?
답은 str1인데, str2가 내용을 변경할 수 있는 문자열인 데 비해 str1은 그 내용을 변경할 수 없는 상수형 문자열이기 때문입니다.
2. 다음 중 문자열은 무엇입니까?
이는 문자열 부분을 다시 공부해보시면 아실 수 있습니다.
3. 다음 중 런타임 에러가 발생하는 코드는 무엇입니까?
arr2는 내용 변경이 가능한 문자열로 배열을 초기화하고 있는 반면, arr1은 문자열 상수로 초기화하고 있습니다.
4. 종합.
이렇게 된 것이지요.
-----
그런데 main 함수의 매개 변수로 넘겨줄 때 두 번째 인자의 타입은 반드시 char **이어야 합니다.
char argv[5][5];와 같은 타입으로 변경할 수가 없지요(이 때 argv는 char (*)[5] 타입이며 이는 char **와는 분명히 다릅니다.).
따라서 위처럼 만드시겠다면, argv[] 문자열을 복사한 후 이 문자열을 수정하는 방법으로 진행하셔야 합니다.
다 써놓고 다시 보니.. "내용 변경이 가능한 문자열로 초기화"라는 문장은 꼭 원래부터 변경이 가능했던 문자열을 대입한다는 말처럼 들리는군요.
배열로 초기화했기 때문에 내용 변경이 가능하다는 설명이 옳습니다.
저는 이렇게 생각했습니다.
argv로 받은 문자는 바로 초기화가 불가능하다는 소리인가요??
흠 그럼... 내용 변경이 가능한 문자열로 초기화 한후에
그 문자열을 toupper이용해서 올려준후에 그걸 출력하게 해야겠군요???
흠.... 아직 모르는게 너무많네요 저는 ㅋㅋ
Q. argv로 받은 문자는 바로 초기화가
Q. argv로 받은 문자는 바로 초기화가 불가능하다는 소리인가요??
A. 프로그램 prog를 다음과 같이 실행하는 상황이라고 생각해보면,
$ prog test1.txt test2.txt
main 함수의 인자 argc와 argv는 각각 다음과 같이 초기화된 것과 사실상 같습니다.
int argc = 3;
char* argv[] = {"prog", "test1.txt", "test2.txt"};
솔직히 질문 자체가 이해가 안 갑니다.
Q. 내용 변경이 가능한 문자열로 초기화 한후에 그 문자열을 toupper이용해서 올려준후에 그걸 출력하게 해야겠군요???
A. char tmp[BUF_MAX]; strcpy(tmp, argv
); 한 다음 tmp를 쓰겠다고 하시는 거라면 옳습니다.
"내용 변경이 가능한 문자열로 초기화한다"라는 말은 좀 거슬리니 "임시 배열을 만들고 문자열을 복사한다"라고 말하는 게 좀 더 좋을 것 같습니다.
저는 이렇게 생각했습니다.
감사합니다 ^^ 해결했습니다 ㅎㅎ
코드를 이런식으로 수정했습니다 ㅎ
많은 도움 주신 두분께 감사드립니다 ㅎㅎ
댓글 달기