seongkwonii   4년 전

아래 코드에서 a[3], b[3]을 a[4], b[4]로 하면 맞는 코드가 됩니다.



  1. char a[3], b[3]을 하고 cin >> a >> b;

    했을 때 왜 a에 b까지 들어가? size를 넘겨서??

    → 123 456이라고 입력하면 a에 123456이 다 들어가버리네요.. 널 값을 저장할 자리가 없어서 그런가요?


  2. char a[3]; 에 123이란 문자가 들어가있을 때 숫자로 한 번에 변환은 안되는군요.

    a-'0'을 하면 숫자 0 이 아닌 아닌 캐릭터 '0'을 빼는 건데 왜 숫자로 변환이 되는거죠?

  3. char a[10];
    a = "hi";이라고 하면 할당이 안되네요.
    음.. hi라는 문자열을 저장할 공간을 따로 할당을 해야 하고, a는 포인터처럼 그 공간을 가리켜야 하기 때문인가요?

    그런데 a[0] = 'a'; a[1] = 'i'; 라고 하면 되는 이유는 처음 선언을 할 때 생성된 공간이 있기 때문이군요?!

dyk777   4년 전

1) c의 문자열은 '\0'을 기준으로 구분합니다. 즉, 만약 문자열의 끝에 있는 '\0'가 어떤 식으로든 없어지게 된다면, 그 뒤에 '\0'가 나타날 때 까지 진행하게 된다는 뜻입니다.

    1-1) a,b의 크기를 4가 아니라 3으로 잡았다고 하셨습니다. 그러면 일단 a에 "123"이 들어가는건 자명합니다. 그럼 뒤의 '\0'은 어디로 갔을까요. 높은 확률로 바로 인접해있는 b[0]에 들어갔을 것입니다. 이 상태에서 b에 입력을 받으면 b에는 "456"이 들어갈 테고, 이때 b[0]에 있던 '\0'이 덮어씌워져 없어지게 됩니다. 또한 같은 이유로 b에 인접한 메모리 공간에 '\0'이 들어갔겠지요. 이 때문에 a의 문자열을 호출하면 "123\0"이 아니라, "123456\0"이 나오는 것으로 보입니다.

2) 문자열의 정수/실수로의 변환에 관해서

    2-1) 정수의 경우엔 atoi나 atol, atoll이 있고, 실수의 경우엔 atof가 있다고 합니다. 자세한 것은 레퍼런스를 찾아보도록 합시다.

    2-2) 정확히 하면, 한 자리 숫자에만 해당이 됩니다. 이는 아스키 코드와 관련이 있습니다. '0' ~ '9'는 순서대로 아스키값 48~57을 갖습니다. 즉, 글자로서의 '0'~'9'는 숫자로서의 0~9와 비교했을때 그 순서와 간격(인접한 숫자의 간격은 1)이 같습니다.

3) 이 또한 문자와 문자열의 차이, 배열&포인터의 성질과 관계가 있습니다. 문자열은 가장 마지막 문자가 '\0'인, 여러 문자들의 sequence라고 할 수 있습니다. 즉, 문자열을 저장하기 위해서는 여러 문자들을 메모리상의 서로 인접한 공간에 저장해야 합니다. 이 때문에 문자열의 저장을 위해서는 char형 "배열"을 사용하는 것이죠.

    3-1) 위의 char a[10];에서 a는 배열의 이름인 동시에 하나의 포인터로서, 선언된 이후로는 메모리상 어느 한 지점을 가리키고 있습니다(%s를 이용하여 문자열을 입력받을 때만 &를 쓰지 않는다고 하는 이유가 이 때문입니다). 그런데 c언어에서는 배열의 이름이 가리키고 있는 주소는 애초에 변경이 불가능하도록 되어 있습니다. a="hi";와 같은 코드는 이를 정면으로 위배하는 것이죠. 다만, 선언과 동시에 할당하는 경우, 즉 char a[] = "hi";와 같은 코드는 필요한 만큼의 메모리를 마련하여 할당할 때 값을 넣어준 채로 할당하는 것으로 생각하면 될 것 같습니다. int num[5]; num = {1,2,3,4,5};는 되지 않지만, int num[] = {1,2,3,4,5};는 되는 것도 같은 맥락입니다.

    3-2) a[0]='h'; a[1]='i';와 같은 코드는 배열의 특정한 칸 내의 값을 바꾸는 코드일 뿐이지, 포인터에 조작을 가하여 주소를 바꾸는 코드가 아니기에 상관없습니다. 덧붙이자면, 이는 []연산자를 사용하여 포인터를 참조한다고도 해석할 수 있습니다. putchar("Hello, world!"[3]);과 같은 코드가 동작하는 것도 이 때문입니다. 실제로 이렇게 쓰는 경우는 거의 없긴 합니다만...

seongkwonii   4년 전

감사합니다.

오랜만이라 자꾸 까먹고 다시 알게되고..하는 과정이 있네요

하나 확인하고 싶은건 1이란 문자를 숫자로 바꾸려고 a= '1';   a - '0'을 하면 숫자 1이 되는건 ascii값 49-48=1이기 때문이 맞죠??


너무 잘 설명해주셔서 감사합니다^^

dyk777   4년 전

이해하신 대로입니다 :)

댓글을 작성하려면 로그인해야 합니다.