c언어 문자 입력 오류(?)
글쓴이: jjsh0503 / 작성시간: 화, 2016/08/16 - 11:49오전
지역입력 프로그램을 만들고 있는데 이상한 요류가 뜹니다
오류내용은
#include <stdio.h> #include <stdlib.h> int main() { int a; int aa; int b; int check=0; char a1[9] = "대한민국"; char a2[20]; char b1[10]; char c[10]; while (1) { printf("출생지역을 선택해 주세요\n"); printf("[1] 국가\n\n"); printf("1. 국내\n"); printf("2. 국외\n"); printf("선택 : "); scanf("%d",&a); if (a==1) { break; } else if (a==2) { b=1; printf("\n출생 국가를 입력해주세요 : "); fflush(stdin); scanf("%c",a1); fflush(stdin); break; } else { system("cls"); printf("올바르지 않은 번호입니다\n"); } } while (1) { if (b==1) { break; } else { while (1) { printf("\n현재 선택된 지역 : %s\n\n",a1); printf("[2] 광역자치단체\n\n"); printf("1. 서울특별시\n"); printf("2. 부산광역시\n"); printf("3. 대구광역시\n"); printf("4. 인천광역시\n"); printf("5. 광주광역시\n"); printf("6. 대전광역시\n"); printf("7. 울산광역시\n"); printf("8. 세종특별자치시\n"); printf("9. 경기도\n"); printf("10. 강원도\n"); printf("11. 충청북도\n"); printf("12. 충청남도\n"); printf("13. 경상북도\n"); printf("14. 경상남도\n"); printf("15. 전라북도\n"); printf("16. 전라남도\n"); printf("17. 제주특별자치도\n"); printf("선택 : "); scanf("%d",&aa); printf("\n"); { b1="서울특별시"; // <--- printf("\n현재 선택된 지역 : %s %s\n\n",a1,b1); printf("[3] 기초자치단체\n\n"); . . . (이하 생략)
인데요 이부분에서 위에 있는 화살표한 저 b1="서울특별시" 부분이 [Error] incompatible types in assignment of 'const char [11]' to 'char [10]' 에러가 뜨면서 실행이 되지 않습니다 이유나 해결 방법을 아시는분이 계시면 도와주세요
Forums:
컴파일러 에러 메시지를 스스로 해석해 보세요.
1. [Error] incompatible types in assignment of 'const char [11]' to 'char [10]'
무슨 의미일까요?
컴파일러 메시지를 해석하는 건 기본 중의 기본입니다.
2. C/C++에서는 배열이 초기화된 이후에는 대입문으로 대입될 수 없습니다.
3. 배열 길이 넘기는 거 조심하세요.
보아하니 한글 한 글자가 2바이트인 문자셋을 쓰고 계신가 본데(EUC-KR이겠죠, 아마?) "서울특별시"만 해도 11byte이고, "세종특별자치시"는 15byte로군요.
NUL 문자까지 포함해서 세고 있다는 거 주목하세요. 생략할 수 있는 경우가 백에 하나 정도 가끔 있는데, 제시된 코드처럼 printf의 %s으로 출력하려거든 반드시 NUL-terminated 되어야 합니다.
10byte 가지고는 턱도 없습니다. 사실 이래서 웬만하면 C언어로 문자열을 배열에 담을 일이 생기는 경우는 가능한 한 피하는 게 좋아요.
4. 그런 의미에서, 애초에 문자 배열을 왜 쓰는 겁니까?
사용자로부터 문자열 입력을 받는 것도 아니면서 말이죠.
광역자치단체 리스트가 그리 쉬이 바뀌는 것도 아닐뿐더러, 어차피 바뀌고 나면 코드 수정도 불가피하니, 그냥 한 군데에 몰아 넣으세요.
뭐, 취향 차이가 있겠지만 저는 이렇게 설계하는 편이 훨씬 낫다고 봅니다.
코드 전체에 광역자치단체 이름이 딱 한 군데에만 등장하니까 보기도 좋고 관리하기도 쉽죠.
사용자 입력은 인덱스 정수로만 관리가 되고 문자열이 필요할 때만 문자열 배열에 접근하면 됩니다.
대한민국 이외의 국가에 대해서도 지원해야 하거나, 코드에서 암시하는 것처럼 광역자치단체별 기초자치단체까지 계속 확장하려면 단순히 저렇게 하는 것 가지곤 안 될 거에요. 2~3차원 배열까지도 도입해야겠죠.
그 쯤 되면 아예 지역 이름을 담는 배열을 별도의 소스코드로 분리해서 관리하는 편이 더 깔끔해질지도 모르겠습니다.
제가 초보라..;;
답글 주셔서 감사합니다.
그런데 제가 프로그래밍을 시작한지 얼마 안되서 strncpy는 뭔가요? 그리고 char 앞에 const는 뭔가요? 또 numlocalgoverment 는 무슨 용도 인가요?
strncpy는 리눅스 쓰신다면 man strncpy
strncpy는 리눅스 쓰신다면 man strncpy 해보셔도 되고 구글검색해도 되고..
const 는 constant 상수를 나타냄. 변수와 다른 점은 말 그대로 변하지 않는다....는 거.
const int numLocalGovernments = sizeof(LocalGovernments) / sizeof(const char *);
보시면 LocalGovernments 크기를 const char * 크기로 나눈다... LocalGovernments 갯수라고 보면 됨.
세벌 https://sebuls.blogspot.kr/
댓글 달기