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

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를 사용하는 것이 좋겠네요.

답변 감사합니다.

노력만이 살길이다.

노력만이 살길이다.