U E D R , A S I H C RSS

문자반대출력/허아영

소 감

*(pCh+lenstr-i-1) = 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바트 문자다)라는 것을 말합니다.
어렵습니다 ㅠ



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:30
Processing time 0.0295 sec