[C언어] 문자열 뒤집기
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>
#include <string.h>
void input(char name[])
{
printf("Enter your name: ");
scanf("%s", &name);
return;
}
void reverse(char name[])
{
int nameSize, i;
char temp;
nameSize = strlen(name);
for (i = 0; i < nameSize / 2; i++) {
temp = name[i];
name[i] = name[nameSize - 1 - i];
name[nameSize - 1 - i] = temp;
}
printf("Reverse: %s\n", name);
}
int main()
{
char name[20];
input(name);
reverse(name);
}
|
cs |
오류가 난 부분은 6번째 줄의 scanf("%s", &name);이다.
&를 지우고 scanf("%s", name);으로 정상 작동함 "%s"쓰면 &를 안 붙여도 된다는 점을 까먹고 실수한거 였는데 한가지 의문은
input이나 reverse함수를 만들지 않고 모든 내용을 main에 고치지 않고 넣었을땐 정상작동함
왜일까 찾아봤다.
call-by-value함수랑 call-by-reference함수를 제대로 이해 못 해서 발생한 일이었음
call-by-value는 인자값을 그대로 복사하는 함수
call-by-reference는 주소값을 전달하는 함수로 내가 만든 input은 배열의 주소값을 전달하기 때문에 call-by-reference다.
main에서는 scanf("%s", name); 일때 name은 name의 첫번째 요소를 가리키는 것이므로 &name이어도 같은 것을 뜻한다.
하지만 input함수를 사용하면 a와 &a는 다른것이된다. a자체가 배열하나의 이름이 아니라 a는 main함수의 name주소값이다. 그래서 &a를 하게되면 main의 a주소값이 아니라 input의 a의 주소값이 들어가게 되는것
즉 저상태로 input을 실행하게되면 main의 name에는 아무것도 안들어가게된다.
'언어 > C' 카테고리의 다른 글
[C언어] 타자게임 만들기 (0) | 2020.07.13 |
---|---|
[C언어] 선택정렬(Selection Sort) (0) | 2020.07.13 |
[C언어] 게임 만들면서 쓴 함수들 (0) | 2020.06.05 |
[C언어] 타자게임 만들기 - 준비 (0) | 2020.06.05 |
[C언어] 금액 맞추기 (중복조합 응용) (0) | 2020.05.10 |