[C언어] 문자열 뒤집기
2020. 5. 12.
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에는 아무것도 안들어가게된다.

myoskin