C언어에서의 replace

luciell의 이미지

요즘 한창 C언어의 재미를 붙인 학생입니다.

문뜩 생각이 나, C언어에서의 replace함수를 구현해보았습니다.

1. 치환한 갯수를 return 해준다.
2. char_replace , str_replace 를 구분하여준다.
- int char_replace(char *str, const char *word, const char *replace_word)
- int str_replace(char *str, const char *words, const char *replace_words)
3. char_replace 는 strchr을 이용하여 쉽게 처리하였습니다.

for(cnt=0; p = strchr(str,word) ; )
{
  if ((char)str[p-str] == word)
  {
      str[p-str] = replace_word;
      cnt++;
    }
  }

4. str_replace 는strtok 를 이용하여 lengh 값이 words >= replace_words 일때는 쉽게 처리가 됩니다.
for(cnt=0; strstr(buf,word) != NULL ;
{
    token = strtok(buf,word);
    while(token != NULL)
    {
      strcat(tmp,token);
      token = strtok(NULL,word);
      if (token != NULL)
      {
        strcat(tmp,replace_word);
        cnt++;
      }
    }
  }
sprintf(str,"%s",tmp);

여기서 에로사항이 lengh 값이 words < replace_words 일때입니다.
이럴땐 malloc 나 strdup 를 이용을 꼭 하여야 가능할껏 같습니다.
그럴경우 그 값을 포인터를 리턴해줘야 하는건가요?(C에서는 문자열리턴이 불가능하다고 알고있습니다.)

여러 개발자 선배님들께선 C언어에서 replace를 어떻게 구현하셨는지 조언 부탁드립니다.

luciell의 이미지

한가지 더 질문드립니다.

main 에서 선언한 char str[200]; 선언한다음

함수로 로 호출하여 str 을
char *s 로 받습니다.
그럼 함수로 전해진 s 은 main char str[200]의 시작주소를 가르키는 포인터가 됩니다.

그러면..

함수로 전해진 str 포인터로 main 에 정의된 str배열의 크기를 알아올순 없는건가요? :(

네가 꿈을 꾸지 않는 한, 꿈은 절대 시작되지 않는단다.
언제나 출발은 바로 '여기'야 떄가 무르익으면, 그럴수 있는 조건이 갖춰지면,
하고 미루다 보면, 오느새 현실에 파묻혀 소망을 잃어버리지.
그러므로 무언가 '되기(be)' 위해서는 반드시 지금 이 순간 무언가를 '해야(do)'만 해
- Stuart Avery Gold 의 우화소설 Ping 중에서..

kgcrom의 이미지

없는걸로 알고있습니다. 그게 있으면 참 편할텐데 말이죠
인자 하나줄어서 좋을텐데.....ㅎㅎ

흘러가고있는 지금 이 시간에 충실하자.

qudals의 이미지

좋은 정보 감사합니다.
말씀해주신 것을 참조하여 단일 문자 교체를 수정해 보았습니다.

char* p;
while( p=strchr(src, word ))
{
*p = replace_word;
}

^^

kgcrom의 이미지

void replace(char *str, char **copy, const char *words, const char *replace_words)
{
        char *token;
        char *q, *p;
        int diff;
        int new_length;
 
        new_length = (strlen(str)/strlen(words))*strlen(replace_words);
        *copy = (char*) malloc ( sizeof(char) * new_length);
        memset(*copy, 0, new_length);
 
        q = str;
        p = *copy;
 
        while( *q != '\0' )
        {
                token = strstr(q, words);
                if ( token != NULL)
                {
                        diff = token - q;
                        while ( diff ){
                                *p = *q;
                                p++; q++;
                                diff--;
                        }
                        strcat(p, replace_words);
                        p = p + strlen(replace_words);
                        q = q + strlen(words);
                }
                else
                {
                        *p = *q;
                        p++;
                        q++;
                }
        }
        *p = '\0';
}

이런방법도 있구나.......하고 알아주세요
우리 열심히 해보아요~

흘러가고있는 지금 이 시간에 충실하자.

전웅의 이미지

strlen(str) < strlen(words) 라면???

--
Jun, Woong (woong at gmail.com)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

kgcrom의 이미지

오호 그렇네요 지적 감사합니다 : )

흘러가고있는 지금 이 시간에 충실하자.

powersys의 이미지

"그럴경우 그 값을 포인터를 리턴해줘야 하는건가요?(C에서는 문자열리턴이 불가능하다고 알고있습니다.)
"

잘못알고 계십니다. 됩니다. 또한 문자열 이란 스트링, 스트링은 C에서 포인터를 의미합니다. s붙은함수들이 대부분 문자열함수 입니다.

님이 구현하고 자하는것은 보기보다 매우 쉽게 구현됩니다.

C에서 주로 기본적인함수같은데 제공되지 않는것은 대부분 간단히 해결되기때문에 없는것이라고 보시면 맞을겁니다.

strstr 함수를사용하시면 더편하게 찾으시고. strcat,strncpy등 이용하면편하게 구현될겁니다.

미리 strstr로 치환될갯수가 나오고 최종size 를 알수 있으니까 for돌면서 버퍼에 순차적제시키면 간단히구현되겠죠??

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.