변수 중간에 비어 있는값 넣는 방법점 알려주세요.

mrbaen의 이미지

후암 어렵네요 C라는놈이

암복호화 함수 만들고 있습니다.
C <=> PHP <=> VB <=> 기타 개발 프로그램

통신하는데 암호화 복호화 함수를 만들고 있습니다.

C에서 막히는 부분을 도저히 못풀고 있습니다.

php에서는 메모리 할당을 하고 중간에 NULL값이 들어가도 변수 길이는 유지 됩니다.

<?
$aa = "abcd";
echo "strlen:" . strlen($aa) . " / $aa\n";
 
$aa[1] = "";
echo "strlen:" . strlen($aa) . " / $aa\n";
?>
[mrbaen@bestlee crypt]$ /usr/local/php/bin/php ./test.php
strlen:4 / abcd
strlen:4 / acd

이런식으로 변수길이는 변화가 없고 2번째 배열에 NULL값이 들어 갑니다.

C에서 같은 방식으로 해봤습니다.

	char buf[4];
 
	strcpy(buf , "abcd");
 
	printf("strlen:%d / %s\n" , strlen(buf) , buf);
 
	buf[1] = 0;
	printf("strlen:%d / %s\n" , strlen(buf) , buf);
 
[mrbaen@bestlee crypt]$ gcc test.c -o test 
[mrbaen@bestlee crypt]$ ./test
strlen:4 / abcd
strlen:1 / a

buf[1] =0; 즉 NULL값을 넣은거죠
문제는 C에서 NULL을 문자열의 끝을 의미 한다는거죠.
해서 이후 글자는 무시 되버립니다.

위에 php에서 처럼
무시 안되게 문자열 길이는 유지 되면서
a(NULL)bcd
이런식으로 집어 넣어야 하는데
도저히 안됩니다.
구조체로도 해보고 memset로도 해보고

다른 님들의 도움도 받아봤는데 안됩니다.

아시는분 좀 알려주세요 ㅠ.ㅠ
그럼 즐프 하세요.

chadr의 이미지

문자열 종료를 널문자로 인식하지 않고 자체적으로 길이를 가지는 자료구조를 만드셔야할것 같습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

wsmrdo의 이미지

기본적으로 문자열의 끝이 널 문자죠.

원 함수가 바뀌지 않는다면..

새로 만들 수 밖에요...

메모리 할당하시면. 해제하기 전에 사라지지 않습니다.

단지 printf 문에서 문자의 끝을 인지하고 그 뒷부분을 보여주지 않는다는 것이죠.

함수 따로 만드십시요 ^^;;

klyx의 이미지

$aa[1] = ""; 이게 그냥 aa[1]을 지운게 아니라 널 문자를 삽입하는 것인가요?
abcd에서 결국 acd가 되었으므로 원하시는건 그냥 문자열 중간의 글자 하나를 지우려는게 아닌지요...?

혹시 그런 거라면 문자열 다루는 함수 몇개를 이용하면됩니다.
예를 들어 간단하게 짜보면..

char *removeAt(char *str, int idx) {
	if (idx >= strlen(str))
		return 0;
	str[idx] = '\0';
	return strcat(str, &str[idx+1]);
}

이정도가 되겠네요.
7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

지난번 글타래에서도 말씀드렸던 것 같은데, C 표준 라이브러리의 문자열 관련 함수는 널 문자가 있는 곳까지만 문자열로 인식합니다.

mrbaen의 이미지

ditto님이 말씀하신데로 맞구요
그걸 해결할려고 했거든요
이기종간 소켓으로 암호화된 걸 전달 해야 하는데
글자 길이가 틀려져서
복호화 하는게 안되서
애먹은거거든요.

NULL이 생기지 않토록 프로그램을 수정해벼렸습니다.

관심 갖어주신 분들께 감사드립니다.

/xylosper
중간에 있는 문자를 지울려는게 아니구요.
비트연산 과정에서 숫자 0이 발생합니다.
0은 말그대로 널이죠
아스키 값이0은 널을 의미 하니깐요
이렇게 되면
전체적으로 문자열 배열상 출력문에는 한칸씩 땡겨지는거로 보여지지만
중간 바이트에는 널이 들어가서
전체적인 길이는 동일 해져야 하는데
C에서는 아주 어렵네요 처리하기가

select99의 이미지

흠.. C가 어려운게 아니라 님이 C를 너무 모르네요..
그리고 스트링개념도.. 지난번에도 말씀드렸듯이..
스트링이 아닌곳에 자꾸 스트링함수를 쓰려니 될리가 있나요.

코끼리는 코로 받아먹고 사람은 손으로 받아먹으면되는데.
코끼리 생각만하고 사람이 손을 놔두고 코로받아먹으려니 될턱이 있겠어요?

중간에 null 을 넣고 싶으면 넣으면됩니다. 매우잘들어갔군요.
printf 에서 %s 가 스트링출력인데 스트링도 아닌걸 출력하려니 될턱이 없지요?
%c 는 캐릭터고 핵사 코드로 출력도 가능하고 putchar 등도 있고 간단히 출력되게 하려면
print( char *str, int n){ int i; for( i = 0; i < n; i++ ) putchar( *(str+i));}
하나 만들어도되고.
뭘하려는지 모르겠지만. 님이 질문하신내용은 php 로하나 c로하나 더어려울것도 없습니다.

몇개 되지도 않는 C함수인데 한번쭉 훑어 보시고 하세요.

klyx의 이미지

함수이전에 자료형을 새로 구현하여야 할 것 같습니다.
하다못해
struct String {char *str; int length;}
와 같은 단순한 구조체라도 정의하여서, str의 길이가 항상 length와 같게 유지하면서 이 구조체를 기반으로 필요한 문자열 함수들을 재구현할 필요가 있을 것 같네요.
C++이면 std::string으로 간단히 해결할수 있겠지만요=_=;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.