질문과 답변

여기서 한글도 정상 출력되도록 할 수 있을까요? 날짜:2020-3-3 11:53:35 조회수:131
작성자 : henrietta
포인트 : 62
가입일 : 2020-02-22 18:58:56
방문횟수 : 107
글 7개, 댓글 17개
소개 :
작성글 보기
쪽지 보내기
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>

  char temp;

int main(){
    
    char line[100],cpline[100]="a"; 
    int b,c=0;
    
    printf("출력시키고 싶은 문장을 입력하세요.\n");
    
    gets(line); // line에 문장을 받고
    
    for(;;){
        
    for(int a=0,b=c;a<strlen(line);a++,b++){ //문장 길이만큼 돌면서
        
        if(c>=strlen(line)) // c로 시작점을 조정
            c=0;
        
        if(line[b]=='\0') //문장 끝에 가면 처음 글자로 가도록
            b=0;
            
        cpline[a]=line[b]; //cpline에 차곡차곡 쌓아서
        
    
    }
    c=c+1; 
    printf("\r");
    printf("%s",cpline); // 문장 출력!
    
    Sleep(200);
    }
    
}

입력한 문장이 계속 스크롤되어 나오도록 짜봤슴다.
영어를 넣으면 그런대로 잘 잘동하는데,
한글을 입력해도 잘 돌아가게 만들수도 있을까요?

목록보기 삭제 수정 신고 스크랩

소엔 3월4일 4:07:09  

굉장히 재미있는 예제네요. 한글도 물론 인식할 수 있습니다.
멀티바이트 문자열 체계에서 영문 코드는 상위 1비트가 0인 0 ~ 0x79까지이고 한글은 0x80이 넘습니다.
또 영문은 1바이트를 차지하는데 비해 한글은 2바이트를 차지합니다.
현재 위치의 문자 코드를 읽어 최상위 비트가 1인지 보고 한글이면 2바이트를 건너뛰면 됩니다.
아래 코드의 강조 부분만 수정하시면 됩니다.

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>

char temp;

int main() {

 char line[100], cpline[100] = "a";
 int b, c = 0;

 printf("출력시키고 싶은 문장을 입력하세요.\n");

 gets_s(line, 100); // line에 문장을 받고

 for (;;) {

  for (int a = 0, b = c; a < strlen(line); a++, b++) { //문장 길이만큼 돌면서

   if (c >= strlen(line)) // c로 시작점을 조정
    c = 0;

   if (line[b] == '\0') //문장 끝에 가면 처음 글자로 가도록
    b = 0;

   cpline[a] = line[b]; //cpline에 차곡차곡 쌓아서
  }
  //c = c + 1;
  if ((line[c] & 0x80) == 0) {
   c = c + 1;
  } else {
   c = c + 2;
  }
  printf("\r");
  printf("%s", cpline); // 문장 출력!

  Sleep(200);
 }

}

line[c] & 0x80) == 0 조건이 c 위치의 문자가 영문인지 점검합니다. 그럴 경우 한칸만 증가하고 아닐 경우, 즉 한글일 경우 두 칸 증가하면 됩니다. 한글도 별 문제없이 잘 스크롤됩니다.



다른 부분은 똑같은데 비주얼 스튜디오 2019에서 gets가 없어져 gets_s로만 바꾸었습니다. 이 함수를 쓸려면 SDL 옵션은 꺼 두어야 합니다. 유니코드라면 모든 문자가 2바이트이므로 이런 조건 점검할 필요 없이 그냥 2바이트씩 건너뛰면 됩니다.
더 재미있게 바꿔 볼 여지가 많은 예제네요. 무한히 스크롤 되는데 키 하나라도 입력되면 중지시키는 기능도 넣으면 좋겠고 아래위 방향키로 속도를 조절하는 것도 재미있을 거 같습니다.
 

henrietta 3월4일 7:09:30  

오오.. 정말 잘 됩니다..ㅠㅠ 실은 한글 입력 했을때는 반 칸씩 가길래, 그럼 두배로 (+2) 하면 한 칸 가나? 싶기도 했는데, 결과적으론 반만 때려맞췄던 셈이네요. 답변 감사합니다. 비트 연산자 사용례도 덤으로 배워가는 것 같네요.

henrietta 3월4일 7:12:55  

ps. c+2만 했을 때 스크롤 자체는 되는데, 막상 끝에 가면 글자가 깨져서 이건 아닌가 했었는데요.
지금 다시 생각해보니까 매번 테스트 할 때마다 입력 문자열에 공백을 넣어서 그런 것이었습니다.
공백이 한글이 아니고 그래서 1바이트인데, 거기에 묻지도 따지지도 않고 무작정 +2만 넣으니 결과가....

소엔 3월4일 9:37:23  

printf("\r")로 첫 줄로 이동하는 코드도 꽤 재미있네요.
콘솔 환경은 좌에서 우로, 위에서 아래로만 이동하는데 줄 처음으로 가니 문자열을 바꿔 출력할 수도 있어 애니메이션이 가능합니다. gotoxy를 쓰면 글자를 임의 위치에 출력할 수 있어 더 많은 효과를 내 볼 수도 있겠습니다.


로그인하셔야 댓글을 달 수 있습니다.