아스키 코드 범위 제한?
글쓴이: poibe / 작성시간: 수, 2007/09/05 - 4:06오후
a = "abcd"
b = "aeqf"
일때,char *c = a xor b하면
맨첫자 같은 경우는 NULL이 나오게 되어 뒤쪽 부분도 정상적으로 나오지 못하게 되더군요..
스트링을 저런식으로 썼다가, 다시 나중에 원복 시키고 할려고 하나 만들었는데,
아스키 코드표상의 0x00 ~ 0x20등 때문에 c를 출력할수가 없었습니다.
특정 문자 범위로 한정지어서 출력하게 할만한 방법은 없을까요?
한정짓더라도 다시
c xor b 를 했을때 a가 나올수 있어야 합니다. ㅠㅠ
Forums:
아스키 코드 범위 제한??
뭔가 상당히 복잡한듯한 질문인데요.
모든 사람들이 알아볼수 있는 통상적인 설명을 하는것이
원하는 대답을 쉽게 얻을수 있답니다.
혼자만이 알아볼수있는 설명은 대답을 얻기가 어렵죠.
그리고 가능하면 간단하게 소스코드를 만들어서 질문하는것이
가장 간편한 방법이지요.
사람들이 사용하는 인간만의 언어가 다르더라도
컴퓨터 언어로만된 컴퓨터용 소스코드는
모든 사람들이 알아볼수 있는 탁월한 이식성을 자랑하죠.
즉 전세계의 어떤사람들이라도 C언어를 사용하는 사람이라면,
전세계의 어떤 특정한 사람이 만든 C언어로된 소스코드는 알아본다는것입니다.
질문하신것이 이 코드가 맞나요?
^(XOR)은 비트연산으로 문자열 전체를 연산할수 없을겁니다.
단순하게 32비트에서 4문자만 연산하는것은 편법을 사용하면,
가능하긴합니다만 그것도 4문자이상은 안될겁니다.
64비트면 8문자까지이겠지요.
공간이 할당되지 않은 포인터는 버그가 되므로
포인터 사용때는 공간을 할당(malloc)하던지 변수의 주소를 복사하던지
두가지 방법중 한가지는 꼭써야되겠죠.
이렇게 사용하는 경우는 별로 없는데 임베디드 시스템에서는
이렇게 무식하게 사용하는 경우도 있다고 합니다.
혹시 이걸 질문하신건가요?
임베디드 시스템에서는 swap함수를 사용할때 ^(XOR)을 사용하여
코드를 줄인다고 들었습니다.
혹시 그걸 질문하신것인지도 모르겠군요.
아스키 코드 범위 제한??의 추가글
비록 위의 글이 원하는 대답이 아니라도
계속 자신의 생각을 질문하세요.
몇번의 질문과 대답의 반복이면,
합의점을 찾을수가 있더군요.
제가 다시 질문에 대한 대답을 할수 있을지는 모르겠지만,
누군가가 다시 대답을 하게 될것입니다.
아무도 시작을 안해서 제가 시작을 했을뿐이죠.
배움이라는것은 그러한 시행착오로 만들어진 경험이더군요.
원하는 대답을 얻기를 바랍니다.
16진수로 출력하면 어떨까 싶네요..
위에서.. 이미 답변하셨던것을...
16진수로 출력하도록 바꾸어보았습니다..
이런 것을 원하신것 같아서...
a=64636261
b=66716561
a^b=c=02120700
c^b=b=66716561
aeqf
안녕하세요 : )
아스키 코드 범위 제한???추가글
잘못된 부분이 있어서 수정합니다.
임베디드 시스템에서는 롬(ROM)을 사용합니다.
위와 같은 방식을 사용하면 *c에 데이타가 써지질 않아서 오류가 발생됩니다.
간단하게 만든다는것이 문제를 만들었네요.
다음과 같이 해야 됩니다.
그리고 *a와 *b의 데이타가 변동이 있어야될 경우 배열을 사용하고,
고정데이타를 별도로 만들어서 strcpy()함수로 복사해줘야 안전합니다.
그리고 임베디드 시스템에서는 swap함수를 사용할때 ^(XOR)을 사용하여
코드를 줄이는 부분은 다음과 같읍니다.
둘다 정수일때는 잘 동작합니다.
swap()는 실수일때 float는 자체 형식이 있어서 C언어에서는 컴파일이 되지 않고 에러가 됩니다.
swap_1()는 실수일때 float도 잘 실행됩디다만 보장하지는 못합니다.
그리고 같은 변수일 경우에는 값의 변화가 없어야 되는데 엉뚱한 값으로 바뀝니다.
다음 사이트에 자세히 설명되어 있읍니다.
워낙 방대한 분량이라서 저도 다 읽지는 못하고 틈틈이 보고 있는데 틀린부분도 있으니까 코드로 구현해서 꼭 확인해보십시요.
Q 10.3의 마지막 문장이 상당히 재미있읍니다.^^
http://cinsk.org/cfaqs/html/node5.html#3.3b
http://cinsk.org/cfaqs/html/node12.html#10.3
Q 10.3
두 변수의 값을 바꾸기 위한 일반적인 매크로를 만들 수 있을까요?
Answer
이 질문에 대한 좋은 답변은 없습니다. 변수가 정수형일때에는 잘 알려진 exclusive OR를 쓰는 방법이 있긴 합니다만 타입이 포인터나 실수(floating-point)일 때에는 동작하지 않으며, 만약 두 값이 같은 변수에 저장되어 있을 때에도 동작하지 않습니다. (또, 정수 타입에 쓸 수 있는, 아주 압축된 코드인 a ^= b ^= a ^= b는 중복된 side effect를 발생시키므로 나쁜 코드입니다. 질문 3.2, 3.3b, 20.15c 참고) 만약, 모든 타입에 대해 쓸 수 있는 매크로를 만든다고 하면, 임시 변수가 반드시 필요하며, 분명 문제가 있는 코드가 됩니다. 왜냐하면:
다른 이름과 절대로 충돌하지 않는다고 보장할 수 있는 임시 변수를 만들 수 없습니다. 즉, 어떤 이름을 선택하더라도, 결국 이 이름과 같은 변수가 이미 존재할 확률이 있으며, 따라서 그 변수의 값이 바뀌어 버리는 경우가 생길 수 있습니다. 만약 ## 연산자를, 두 인자에 써서, 이름을 만들어 낸다고 해도, 합쳐서 만든 이름이 31 글자를 넘는다면10.2, 다른 이름과 겹치지 않는다고 보장할 수 없습니다. 또한 간단한 이름이 아닌, 예를 들어 a[i]와 같은 인자가 들어왔을 때에는 제대로 동작하지 않을 것입니다. 질문 1.29에서 다룬 것처럼, __tmp와 같은 이름을 써서, 사용자나 컴파일러 namespace에서 (완벽히 보장할 수는 없지만) 쓰이지 않는 이름을 만들 수도 있습니다.
또, 임시 변수를 정확한 타입으로 선언할 방법이 없습니다. (C 표준에서는 typeof와 같은 연산자를 제공하지 않습니다.) 혹은, 적당한 크기의 메모리 공간을 만들고 그 곳에 memcpy와 sizeof 연산자를 써서 바이트 단위로 복사하는 방식을 쓸 수도 있으나, 만약 매크로에 전달된 인자가 register로 선언되었다면 이 방법도 불가능합니다.
가장 좋은 해결책은, 두 변수의 타입을 매크로 인자로 전달하지 않는 한, 위와 같은 매크로로 처리하겠다는 생각을 접는 것입니다. (또, 만약에 어떤 structure나 배열을 바꾸겠다는 생각을 했다면, 단순히 이들을 가리키는 포인터의 값을 바꾸는 것으로 해결할 수 있습니다.)
다시 말하지만, 두 변수의 내용을 매크로를 써서 바꾸겠다는 생각에 사로잡혀 있다면, 재고하기 바랍니다. 당신의 에너지를 소비할 가치가 있는 다른 일들도 많이 널려 있습니다.
댓글 달기