1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /*두 문자열의 내용을 서로 교환하는 함수를 포인터를 이용하여 작성하라.*/ #include <stdio.h> void swapStr(char **str1, char **str2) { char *temp; temp = *str1; //*str1에는 ass의 주소(&ass)가 들어있다. 그러니까 temp는 그냥 포인터다. 이중포인터가 아님. *str1 = *str2; *str2 = temp; } int main(){ char *dat = "||||
"; char *ass = "$$$$
"; printf(dat); printf(ass); printf("--------------------------------
"); swapStr(&ass, &dat); printf(dat); printf(ass); return 0; } | cs |
스와핑 저도 정말 좋아하는 데요
제가 한번 해보겠습니다.
아우 빡쳐 개어렵당
함수를
1.
void swapStr(char *str1, char *str2){...}
swapStr(ass, dat);
요렇게 하면 안되는 이유를 정확히 설명하지 못하겠어요. 도움!
2.
&ass와 ass는 다른데
ass == &ass[0]이고
&ass는 포인터 변수 ass 자체의 주소값인 듯?
내용을 안바꾸고 주소만 바꾸는건 일반적인 활용도는 아니니까. 그리고 문자열을 배열로 선언해봐 char dat[] = "..."; 이런거 지원도 못해주게 돼.
2번은 네 말이 맞음.
코세님 제가 질문을 잘못해서 고쳐놨음. 함수의 인수로 이중포인터가 아닌 그냥 포인터를 쓸때....
값에의한 전달 때문에 안된다고 말은 하겠는데 뭔가 부랄을 탁 칠만한 해설을 못하겠음
니가 예제를 잘못 짰으니까.
값에 의한 전달의 한계 때문에 주소를 전달하는 예는 일반적인 swap 의 경우지.
문자열 swap 의 경우는 내용물을 바꿔야 하는건데, 넌 애초에 literal 문자열을 바로 바꾸려고 시도하고 있기 때문에 안됨.
리터럴 문자열은 데이타 메모리 영역에 이미 글자수만큼 할당이 되어있는건데, 긴 문자열을 짧은 문자열 시작주소에 옮겨쓴다고 생각하면 결국 무언가를 덮어버리게 되지.
그러니까 이런경우는, 배열로 서로 교환할 수 있는 크기(넉넉하거나, 실제 내용과 같은 크기)로 할당해 놓은 문자열의 시작주소를 넘기도록 만들어야 함.
예를들어 char dat[256]; strcpy(dat, "||||"); 이런식.
리터럴 문자열끼리 서로 길이가 같은경우는, 값의 변경을 허용하는 컴파일러도 있고 아닌 컴파일러도 있다.
저 위의 코드에서 서로 다른 길이의 문자열을 넣어도 제대로 작동하긴 하는데 그게 될지 안 될지는 컴파일러에 달려 있다는 말이군요...표준이 아니다 그말이네여
저 위의 코드는 주소만 바꾸잖아. 그건 문자열 스왑이 아니지.
멍청멍청아 ㅡ,.ㅡ
니가 주소록 프로그램을 만드는데 파일 등으로 부터 입력받은 문자열을 링키드 리스트 같은 메모리 구조로 적재한다고 생각해봐. 주소만 바꿔서 되겠니? 링키드 리스트의 모든 항목들이 파일에서 입력받을때 쓴 동일 주소만 가리키고 있을텐데?
니가 소스코드 첫줄에 적어놓은것도 "두 문자열의 내용을..." 이라고 했지. 문자열의 내용을 바꾸는게 주소를 바꾸는게 아니란 말씀.
그렇네요 ㅋㅋ 예제 자체를 잘못 말했구나
어쨌든 오늘도 가르쳐줘서 고맙습니다!
문자열을 스왑해야하는 용도는 잘 없다.
니가 변수 a, b 의 내용을 바꾸는 swap 을 t = a, a = b, b = t 라고 정의하는것 처럼.
문자열 a, b 의 내용을 바꾸는 swap 은 strcpy(t, a), strcpy(a, b), strcpy(b, t) 여야 한다.
그 안에 반복문 하나로 최적화할 수 있지만, 그것 역시 문자열 a, b 중 길이가 긴 녀석을 기준으로 삼아야겠지. 아니면 조금 복잡하게 플래그를 두던가.
ㄴ던가->든가