[완료]문자열 중간에 한 문자를 삽입하는 방법

dcmru의 이미지

소스를 짜보다가 정상적인 작동이 안되어 질문드립니다.

제목대로 문자열 중간에 한문자를 삽입하는 방법이 생각이 나질 않습니다.

예를 들어 문자열 "abcdefghijk" 가 있다면 중간에 'c' 다음에 'q' 를 삽입한다면

완성된 문자열은 "abcqdefghijk" 를 만드는 것입니다.

제가 생각한 소스는

removed라는 문자배열에 "abcdefghijk" 가 들어 있습니다.

sprintf(removed+(rc+1), "%s", removed+rc);
*(removed+rc) = 'q'; 인데

rc 는 카운트입니다.

위의 sprintf 로 출력해보면 문자열 내에는 "abcqqqqqqqqq"이 만들어집니다.

위의 소스는 뭐가 잘못된 것인지, 다른 좋은 방법이 있을까요?

정태영의 이미지

저런건 앞에서부터 복사하게 될 경우 위에서 같은 문제가 생깁니다. 뒤에서부터 복사해야 되요 ;)

만약 removed 란 버퍼의 세 번째에 c 라는 변수에 들어있는 값을 삽입해넣을려고 한다면 아래와 같은 식으로 해야합니다. (버퍼는 충분한 크기로 할당되어있다는 전제하에)

int i = strlen(removed);
 
removed[i+1] = '\0';
for( ; i > 2 ; i-- )
    removed[i] = removed[i-1];
 
removed[i] = c;

아래와 같이 하면 코드는 조금 더 짧아지겠군요. ;)

int i;
for( i = strlen(removed)+1 ; i > 2 ; i-- )
    removed[i] = removed[i-1];
 
removed[i] = c;

-----------
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명사용자의 이미지

memmove 를 쓰세요

memmove(removed+rc+1, removed+rc, strlen(removed) + 1 - rc);
*(removed+rc) = 'q';

esrevinu의 이미지

#include <stdio.h>
#include <string.h>
 
int main()
{
  char s[100] = "abcdefghijk";
  char *c;
  int n;
 
  if (c = index(s,'c')) {
    n = strlen(c+1)+1;
    memmove(c+2, c+1, n);
    *(c+1) = 'q';
  }
 
  printf("s = %s\n", s);
}

한번 짜봤습니다.

--
foldl (flip (:)) [] "universe"

dcmru의 이미지

생각하지도 못한 방법들이 있었네요 ^^

간편한 memmove를 사용하는 것이 좋겠네요.

답변 감사합니다.

노력만이 살길이다.

노력만이 살길이다.

댓글 달기

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