2012-02-14 5 views
1

일부 문자로 채워진 문자 배열이 있습니다. 내 char 배열에 "HelloWorld"가 있다고 가정 해 보겠습니다. (문자열이 아닌 0에서 9까지의 색인을 가져옴)문자 배열 중간에 문자 삽입

내가하려고하는 것은 배열의 중간에 문자를 삽입하고 나머지 문자를 옆으로 밀어 새로운 문자를위한 공간을 만듭니다 삽입됩니다.

그래서 문자 배열에 "Hello.World"가 있도록 만들 수 있습니다.

char ch[15]; // assume it has "HelloWorld" in it 
for(int i=0; i<=strlen(ch)-1; i++) { 
    if(ch[i]=='o' && ch[i+1]=='W') { 
     for(int j=strlen(ch)-1; j>=i+2; j--) { 
      ch[j] = ch[j-1]; // pushing process? 
     } 
     ch[i+1] = '.'; 
     break; 
    } 
} 

더 쉬운 방법이 있을까요? 나는 이것에 대해서 너무 복잡하게 생각할지도 모른다.

+0

"죄송합니다.하지만이 주제에 관해 다시 질문해야합니다." [완벽한 질문 작성하기] (http://tinyurl.com/so-hints)를 읽고 필요한 답을 얻는 데 도움이 될 것입니다. – Johnsyweb

+0

관련 : http://stackoverflow.com/questions/9284916/how-to-push-char-array – amit

+0

@Johnsyweb : 지금 나와 다른 질문이 보입니다.그는 도움을 요청했고, 약간의 진전을 이뤘고, 다시 붙어서 그것을 해결하는 방법을 묻습니다. – amit

답변

2

모든 문자를 하나씩 이동하려면 memmove을 사용하면됩니다.

#include <string.h> 

char ch[15]; 

int make_room_at = 5; 
int room_to_make = 1; 

memmove(
    ch + make_room_at + room_to_make, 
    ch + make_room_at, 
    15 - (make_room_at + room_to_make) 
); 
3

strlen(ch) + 1이 아닌 내부 루프를 시작해야합니다 (NULL- 터미네이터를 올바른 한 곳으로 이동해야하기 때문에 strlen(ch) - 1이 아님). strlen길이가 인 문자열이 string[strlen(string)] == '\0' 인 것을 반환합니다. C 문자열의 NULL 종결 자 색인을 얻는 함수로 strlen을 생각할 수 있습니다.

+0

하하 내가 게시 한 직후에 내가 그것을 편집했기 때문에 나는 깨달았다! – Haxify

+0

@Haxify 업데이트 된 질문을 반영하여 답변을 업데이트했습니다. –

1

단순히 수행 내부 루프

#define SHIFT 1 
char bla[32] = "HelloWorld"; // We reserve enough room for this example 
char *ptr = bla + 5;   // pointer to "World"  
memmove(ptr + SHIFT, ptr, strlen(ptr) + 1); // +1 for the trailing null 
1

초기 시작 값은 단기이다. 그것은 다음과 같아야합니다. 문자가 오른쪽으로 이동하고 있기 때문에, 새로운 null 종결을 추가 할 필요가 있음도 참고 : "이것은 좋은 방법이다"는 같이

ch[strlen(ch) + 1] = '\0'; 
    for(j=strlen(ch); j>=i+2; j--) { // note no "-1" after the strlen 

편집을 지금까지 부분적으로는 합리적이라고 생각합니다. 그것은 단지 의도 된 목적에 달려 있습니다. 몇 가지 생각이 떠오른다.

  • strlen 호출을 줄이는 것이 좋습니다. 최적화가 얼마나 좋은지에 따라 달라질 수 있습니다 (일부는 최적화되어있을 수 있습니다). 그러나 strlen을 호출 할 때마다 널 종결자를 찾는 문자열을 검색해야합니다. 트래픽이 많은 코드에서는이를 더할 수 있습니다. 따라서 변수에 초기 길이를 저장 한 다음 다른 곳에서 변수를 사용하면 도움이 될 수 있습니다.
  • 이 유형의 작업에는 버퍼 오버플로가 발생할 수 있습니다. 항상 버퍼가 충분히 길어야합니다 (OP에 있음).
0

문자 배열을 조작하려는 경우이를 고정시키지 마십시오. 이렇게하면 :

char ch[15]; 

항상 15 자로 배열을 하드 코딩하고 있습니다. 포인터를 만드는 것은 1 단계입니다.

char* ch; 

이렇게하면 필요에 따라 수정할 수 있습니다.