2009-11-05 11 views
1
char *funcNames[]= {"VString","VChar","VArray","VData"}; 

    for(int i=0;i<4;i++) 
    { 

     char* temp = funcNames[i]; 
     int len = strlen(funcNames[i]); 
     for(int j = 0;j<len ;j++) 
     { 
      if(j!=0) 
      { 
       char arr = temp[j]; 
      } 
     } 
} 

여기서 "V"를 char 배열의 모든 문자열에서 분리하고 싶습니다. string.i의 시작 부분에 "V"가없는 다른 문자 배열을 만듭니다. 다른 문자 배열을 원합니다 {String, char, array, data } ... 문자 배열을 만들 수 없습니다 .... 내 문제를 해결하는 데 도움이됩니다 ...문제가 있습니까?

답변

5

정말 사본이 필요합니까? 당신은 새로운 배열이 원래의 문자열로 가리키는 만들 수 :

을 위해 배열과 포인터 사이의 유일한 작은 차이는 내가 선택할 것이다있다
char *newArray[4]; 
for (i = 0; i < 4; i++) { 
    newArray[i] = funcNames[i] + 1; 
} 
+0

결코 정확히 내가 문자열의 첫 글자를 건너 뛰고 싶어 칼을 복사 ... – Rajakumar

+0

을 그렇다면이 솔루션은 아마도 여러분에게 더 좋을 것입니다. 왜 원래의 것들이 잘 될 때 문자열을 복사하고 낭비하는 시간을 낭비할까요? –

+0

Carl의 코드가 정확합니다. 각 문자열의 첫 번째 문자는 건너 뜁니다. –

2

: 당신은 출력에서 ​​볼 수

#include <stdio.h> 
#include <string.h> 
#include <assert.h> 

int main (void) { 
    int i; 
    char *funcNames[]= {"VString","VChar","VArray","VData"}; 

    // This is the code that dupicates your strings by allocating an array, 
    // then allocating each string within that array (and copying). 
    // Note we use strlen, not strlen+1 to mallocsince we're replacing the 
    // 'V' at the start with the zero byte at the end. Also we strcpy 
    // from char offset 1, not 0 (to skip the fist char). 

    char **newNames = malloc (sizeof(char*) * sizeof(funcNames)/sizeof(*funcNames)); 
    assert (newNames != NULL); 
    for (i = 0; i < sizeof(funcNames)/sizeof(*funcNames); i++) { 
     newNames[i] = malloc (strlen (funcNames[i])); 
     assert (newNames[i] != NULL); 
     strcpy (newNames[i], funcNames[i] + 1); 
    } 

    /* Use your newNames here */ 

    for (i = 0; i < sizeof(funcNames)/sizeof(*funcNames); i++) { 
     printf ("funcNames[%d] @%08x = '%s'\n", i, funcNames[i], funcNames[i]); 
     printf (" newNames[%d] @%08x = '%s'\n", i, newNames[i], newNames[i]); 
     putchar ('\n'); 
    } 

    // Finished using them. 

    // Free the strings themselves, then free the array. 

    for (i = 0; i < sizeof(funcNames)/sizeof(*funcNames); i++) 
     free (newNames[i]); 
    free (newNames); 

    return 0; 
} 

그 메모리에있는 변수의 위치는 다른 새로운 문자열의 내용 것을 당신이 원하는 무엇인가 :

funcNames[0] @00402000 = 'VString' 
newNames[0] @006601c0 = 'String' 

funcNames[1] @00402008 = 'VChar' 
newNames[1] @006601d0 = 'Char' 

funcNames[2] @0040200e = 'VArray' 
newNames[2] @006601e0 = 'Array' 

funcNames[3] @00402015 = 'VData' 
newNames[3] @006601f0 = 'Data' 
+0

'assert (newNames [i]! = NULL); ' – pierrotlefou

+0

예, 사용하기가 너무 드물기 때문에 감각이 바뀌 었음을 잊었습니다 :-) 업데이트가 수정되었습니다. – paxdiablo

2

당신이 다음 복사본을 만들 필요가 있다면 당신은 동적 ALLOC를 사용해야합니다 복사본을 보관할 버퍼를 만드는 작업.

char *newArray[4]; 
for (i = 0; i < 4; i++) { 
    newArray[i] = malloc(sizeof(char) * streln(funcNames[0])); 
    strcpy(newArray[i], funcNames[i] + 1); 
} 

당신은 각각 할당 된 버퍼에 free()를 호출해야합니다 : 당신은 무엇을 할 것인가하는 것은 포인터의 배열을 선언하고 배열의 각 항목에 할당 된 문자열 버퍼를 배치합니다.

아니면 할당하고 싶지하고 있습니다하지 않는 경우 funcNames에있는 문자열의 최대 길이 알고

#define MAX_FUNC_NAME_LEN 32 
char newArray[4][MAX_FUNC_NAME_LEN]; 
for (i = 0; i < 4; i++) { 
    strcpy(newArray[i], funcNames[i] + 1); 
}