C 문자열 같은 경우에는 파이썬과는 다르게 문자열의 크기를 직접 지정해주기 때문에 오류가 나는 경우가 종종 있습니다.
그래서 이번에는 제가 겪었던 오류들을 정리해볼 생각입니다.
우선 저번에 썻던 코드를 가져와 보겠습니다.
#include <stdio.h>
int main()
{
char word[9];
printf("코인명: ");
scanf("%s", word);
printf("입력한 코인: ");
printf("%s", word);
return 0;
}
저번에는 "Ethereum"만 입력했었습니다.
이번엔 이걸 가지고 오류를 좀 내보겠습니다.
크기 오류
보통 문자열을 출력할 때 크기를 지정하는데, 이때 크기를 넉넉히 지정해주지 않는 다면 오류가 납니다.
#include <stdio.h>
int main()
{
char word[9];
printf("코인명: ");
scanf("%s", word);
printf("입력한 코인: ");
printf("%s", word);
return 0;
}
위 코드에서 char를 9개의 배열로 만들어었습니다. 그러면 이번에 한번 9개 문자 이상을 적어 보겠습니다.
네, 이번엔 EthereumString(14글자) 를 입력하니 보는 것과 같이 출력은 됬습니다.
하지만, 직접 출력해보시면 아시겠지만 프로그램이 안 끝나고 예외가 발생했다고 경고가 보입니다.
이렇 듯 파일의 크기를 적절하게 할당 해주어야 합니다.
한글
영어랑 한글은 우선 좀 차이가 있는데요.
위에 코드를 다시 실행해서 확인해보겠습니다.
보게되면 "이더리움클래식(7글자)"를 입력 출력해보았습니다.
하지만 이번에도 실행해보셨으면 아시겠지만, 프로그램이 안 끝나고 예외가 발생했다고 합니다.
이는 아까와 같이 char 배열, 문자열에 배정된 크기가 부족해서 생기는 현상입니다.
근데 이더리움클래식은 7글자였죠? 그러면 char word[9]; 으로 9개를 배정했으니 원래 영어라면 오류 없이 출력이 되었어야 합니다.
하지만 한글이 오류가 난 이유는 한글이 영어와 문자를 표현하는 byte 크기가 다르기 때문입니다.
영어는 ASKII 1바이트 체계를 사용하는 반면에,
한글은 UNICODE 2바이트 체계를 사용하기 때문에 오류가 나는 것입니다.
그렇기에 다음과 같이 코드를 바꾸어주면 오류가 안나게 됩니다.
#include <stdio.h>
int main()
{
char word[15];
printf("코인명: ");
scanf("%s", word);
printf("입력한 코인: ");
printf("%s", word);
return 0;
}
이더리움클래식(14byte) + NULL문자 해서 15바이트로 문자열을 선언해주었습니다.
결과를 봐보면.
그러면 이와 같이, 코드가 중간에 멈추지 않고, 오류도 뜨지 않고 잘 실행되는 모습입니다.
NULL
보통 이 NULL 문자 때문에 많이 오류가 납니다.
NULL 문자는 저번에도 말씀드렸지만 문장의 끝을 나타내 줍니다.
그래서 항상 문자열의 크기를 할당할때도 NULL 문자의 공간을 생각했었습니다.
그렇다면 NULL 문자가 들어갈 공간을 할당해주지 않는다면 어떻게 될까요?
#include <stdio.h>
int main()
{
char word[3];
printf("입력: ");
scanf("%s", word);
printf("출력: ");
printf("%s", word);
return 0;
}
이 코드로 봐보겠습니다. 지금 문자열을 3바이트 크기로 만들었습니다.
실행해서 abc를 입력해보겠습니다.
그럼 위에서와 같이 실행은 됬는데, 프로그램이 멈췄습니다. NULL 문자가 있을 공간이 없기 때문이겠죠.
그리고 또 이런경우를 생각할 수 있습니다.
처음에 우리가 a를 입력했는데, 뒤에 b를 붙이고 싶을 수도 있습니다. 다음 코드를 봐보겠습니다.
#include <stdio.h>
int main()
{
char word[3];
printf("입력: ");
scanf("%s", word);
word[1] = 'b';
printf("출력: ");
printf("%s", word);
return 0;
}
이렇게 문자열 a 다음공간에 b를 채워주었습니다. 실행해보겠습니다.
그럼 보는 것과 같이 이상한 한자?? 문자?? 들이 같이 출력되었습니다.
우리가 앞서 배웠듯이 NULL은 문자열의 끝을 알려준다고 했습니다.
근데 NULL이 b라는 문자로 대체되어지는 바람에 이상한 문자들이 출력되다가 NULL 비슷한 문자를 만나면 그제서야 종료가 되는 것입니다.
이를 해결하려면 우리가 저번에 배운 NULL로 초기화 하는 방법을 써야합니다.
#include <stdio.h>
int main()
{
char word[3] = "";
printf("입력: ");
scanf("%s", word);
word[1] = 'b';
printf("출력: ");
printf("%s", word);
return 0;
}
위 코드를 보면 word 문자열을 ""을 사용하여 NULL로 초기화해준 모습입니다.
그러면 앞서했던 것과 같이 실행해보겠습니다.
아까와는 다르게 이상한 문자들이 보이지 않고 잘 출력된 모습입니다.
이렇게 문자열에 대해 알아보았습니다. 확실히 파이썬보다 더 신경써야 하는게 많은 느낌입니다.
댓글