소 감 ¶
*(pCh+lenstr-i-1) = tempi; 이 부분에서 자꾸
*(pCh+lenstr-i) = tempi; 이렇게 코딩해서, 컴파일은 되는데, 결과물이 안나와서 답답했었다.
널 문자를 생각 못했던 아영
*(pCh+lenstr-i) = tempi; 이렇게 코딩해서, 컴파일은 되는데, 결과물이 안나와서 답답했었다.
널 문자를 생각 못했던 아영
그리고 char 함수를 처음 사용해서. 처음에 에러도 많이 났다.
그리고 파일 입출력도 익숙치 않다. 연습좀 해야겠다.
그리고 파일 입출력도 익숙치 않다. 연습좀 해야겠다.
암튼 성공 ~!
- ver2 를 만들려고 한다.
영어와 한글을 구분하는 것은 구했는데,
한글문자열을 반대로 출력하는 알고리즘이 떠오르지 않는다.
많이 고민중... +_+
- ver.2 완성 !
원시적인 방법으로 했다.
리펙토링이 필요하다.
단점: 한글과 영어를 섞어서 사용 못한다는 점. 영어와 한글을 섞을 수 있는 ver.3 만드는 것이 문제.
choiceNum을 영어, 한글, 문자로 세분화 하려고 했으니 일단은 저렇게 코딩.
ver.1 ¶
영어문자열만 실행되는 프로그램
~cpp /*파일에서 입력받은 문자열을 반대로 출력하는 프로그램*/ #include <stdio.h> #include <string.h> #include <stdlib.h> char strchange(char ch[50], int lenstr); void main() { char ch[50], *pCh; int lenstr; FILE *fp1, *fp2; pCh = ch; fp1 = fopen("source.txt", "r"); fgets(ch, 50, fp1); //파일에서 읽어옴 fclose(fp1); printf("Before string = %s \n", ch); lenstr = strlen(ch); *pCh = strchange(pCh, lenstr); fp2 = fopen("result.txt", "w"); printf("After string = %s \n", ch); fputs(ch, fp2); fclose(fp2); } char strchange(char *pCh, int lenstr) { int i; char temp[50]; for(i = 0; i <= lenstr; i++) { temp[i] = *(pCh+i); } for(i = 0; i <=lenstr; i++) { *(pCh+lenstr-i-1) = temp[i]; } return *pCh; }
ver.2 ¶
~cpp /*파일에서 입력받은 문자열을 반대로 출력하는 프로그램 ver.2*/ #include <stdio.h> #include <string.h> #include <stdlib.h> char strchange(char ch[50], int lenstr, int choiceNum); void main() { char ch[50], *pCh; int lenstr, choiceNum, i = 0; FILE *fp1, *fp2; pCh = ch; fp1 = fopen("source.txt", "r"); fp2 = fopen("result.txt", "w"); fgets(ch, 50, fp1); //파일에서 읽어옴 lenstr = strlen(ch); if('A'<= ch[i] && ch[i] <='z') { choiceNum = 0; // 영어 }else { choiceNum = 1; // 한글?? } *pCh = strchange(pCh, lenstr, choiceNum); fputs(ch, fp2); fclose(fp1); fclose(fp2); } char strchange(char *pCh, int lenstr, int choiceNum) { int i; char temp[50]; switch(choiceNum) { case 0: for(i = 0; i <= lenstr; i++) { *(temp+i) = *(pCh+i); } for(i = 0; i <= lenstr; i++) { *(pCh+lenstr-i-1) = *(temp+i); } break; case 1: for(i = 0; i < lenstr; i++) { *(temp+i) = *(pCh+i); } for(i = 0; i < lenstr; i+=2) { *(pCh+lenstr-i-2) = *(temp + i); *(pCh+lenstr-i-1) = *(temp+i+1); } break; } return *pCh; }
C++ 로 ¶
~cpp //cpp1.cpp #include <iostream.h> #include <string.h> #include "cpp.h" void main() { Mystring mystr; mystr.input(); mystr.str_reverse(); mystr.output(); }
~cpp //cpp2.cpp #include <iostream.h> #include "cpp.h" #include <string.h> void Mystring::str_reverse() { str_len = strlen(ch); int i = 0; while(ch[i])// 간단히 영어만 된다. { str_temp[str_len-i-1] = ch[i]; ++i; } } void Mystring::input() { cin>>ch; } void Mystring::output() { int i = 0; while(str_temp[i] > 0) { cout<<str_temp[i]; ++i; } cout<<"\n"; }
~cpp //cpp.h class Mystring { private : char ch[50]; int str_len; char str_temp[50]; public : void str_reverse(); void input(); void output(); };
나한테 할 말 ¶
한글로된 문자열을 입력 했을 때 다른 결과가 나온다. 예를들어 최경현 이란 문자를 입력하면 置麗零 이렇게 나와 .... 내가 만든거도 이렇게 나온다 마찬가지 ..ㅠ.ㅠ --최경현
좋은 발견입니다. 한글 한 글자는 알파벳(1바이트)과 달리 2바이트입니다. 따라서 위 코드와 같이 해주면 영어와 같은 알파벳은 거꾸로 출력되지만 한글은 아예 문자열이 바뀌게 됩니다. 한글같은 2바이트 확장문자도 반대로 출력되게 구현을 한번 해보세요. - 보창
비베에서는 한글이나 일본어처럼 2바이트를 사용하는 글자의 경우 알아서-_- 판단하고 한 글자 단위로 읽는 함수가 있긴 한데 씨에서는 알파벳과 같은 1바이트 문자인지 아니면 2바이트 문자인지를 어떻게 구분해야 할까요? -태훈 zyint
ascii code를 봐서 MSB ( most significant bit)가 1 이면 아마.. 2바이트문자일 겁니다.. - 임인택
한글로 해봤었는데, 이 프로그램은 영어만 되나, 하고 생각했었습니다. MSB를 이용하면 되겠군요. MSB에 대한 자세한 설명이 필요합니다. --아영
MSB는 비트로 표현된 값에서 가장 중요한 요인이 되는 값을 말합니다. 가령 10001000 이라는 값이 있을때 가장 왼쪽에 있는 1이 MSB입니다. 마찬가지로 가장 왼쪽에 있는 0을 LSB (Least Significant Bit)라고 합니다. 지금 설명드린 내용은 BigEndian Machine 의 경우, 즉, 비트를 왼쪽에서 오른쪽으로 읽는 아키텍처에서의 MSB, LSB를 설명드린 것이고, LittleEndian (비트를 오른쪽에서 왼쪽으로 읽는) 아키텍처에서는 LSB와 MSB가 바뀌어야겠죠. 현대의 거의 모든 아키텍처에서 영문은 ascii 코드로 표현합니다. ascii코드의 값은 0~127인데 이를 8비트 2의 보수를 사용해서 표현하면 MSB가 모두 0 이 됩니다. 이 경우에는 해당 문자가 1바이트의 문자란 것을 뜻하고, MSB가 1인 경우에는 뒤에 부가적인 정보가 더 온다 (죽, 이 문자는 2바이트 문자이다)라는 것을 말합니다.
어렵습니다 ㅠ