2015-01-13 6 views
-1

소스 문자열과 연결하기 위해 다른 문자열을 선언하지 않고 문자열을 확장하는 방법은 무엇입니까? `어떻게해야,병합하지 않고 확장 문자열


      // Figuratively clarification: 

char *string = malloc(16); 
strcpy(string, "Stack/Overflow"); 
&string[5] = expand(5); 

           // Result (In-memory): 

Idx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
Chr: S t a c k \0 \0 \0 \0 \0 /  O v e r f l o w \0 
+3

이'및 문자열 [5] = (5) 확장 무엇인가? –

+2

코드에 [* undefined behavior *] (http://en.wikipedia.org/wiki/Undefined_behavior)가 있고 16 바이트 만 할당 된 메모리 영역에 17 바이트를 씁니다. ' '\ 0' '을 잊지 마라! –

+1

문제에 관해서는 ['realloc'] (http://en.cppreference.com/w/c/memory/realloc), ['memcpy'] (http : // en .cppreference.com/w/c/string/byte/memcpy) 및 ['memset'] (http://en.cppreference.com/w/c/string/byte/memset)에서 볼 수 있습니다. –

답변

1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *expand(char *s, int index, int size){ 
    size_t new_size = strlen(s) + size + 1; 
    char *temp = realloc(s, new_size); 
    if(temp == NULL){ 
     fprintf(stderr, "realloc error!\n"); 
     free(s); 
     exit(EXIT_FAILURE); 
    } 
    s = temp; 
    memmove(s + index + size, s + index, strlen(s + index)+1); 
    memset(s + index, '\0', size); 
    return s; 
} 

int main(void) { 
    char *sentence = "Stack/Overflow"; 
    char *string = malloc(strlen(sentence) + 1); 
    int i; 

    strcpy(string, sentence); 
    string = expand(string, 5, 5); 
    printf("Idx: "); 
    for(i=0; i <= 21; ++i) 
     printf("%3d", i); 

    printf("\nChr: "); 
    for(i=0; i <= 21; ++i){ 
     if(string[i]) 
      printf("%3c", string[i]); 
     else 
      printf("%3s", "\\0"); 
    } 
    printf("\n"); 
    free(string); 
    return 0; 
}