2012-12-13 4 views
6

부호없는 int 배열 난 int 배열 포인터와 같은 배열의 길이가 : 또한 문자열 및 버퍼가의 sprintf 및 C

unsigned int length = 3; 
int *array;  // Assume the array has 3 initialized elements 

을 (추정 충분히 크다) 등의 sprintf에 넣어 :

char buffer[128]; 
const char *pattern = "(%d, %d, %d)\n"; 

pattern은 거기에 "% d 개"의 다른 문자가있을 것이라는 점을 가정하지만, 어떤 형태가 될 수있다 (즉, "테스트 % 1! : % d"또는 "% d 개 % d ")이고, 길이가 array 인 경우 항상"% d "의 수와 같아야합니다.

배열의 길이는 무엇이든 될 수 있으므로 array의 요소를 명시 적으로 열거하지 않고 sprintf (buffer, pattern, &array[0], &array[1], &array[2])을 수행 할 수있는 방법이 있습니까? sprintf (buffer, pattern, array)의 줄을 따라 뭔가가 있습니다. 필요한만큼 도우미 함수를 작성할 수 있습니다. 나는 va_list를 위장 할 생각을하고 있었지만, 이것은 프로그램을 특정 컴파일러로 제한하기 때문에 좋지 않은 것으로 보인다. 형식 문자열이 될 필요가 있기 때문에 당신이 뭔가를 할 수

답변

2

...

char* format_uint_array(char *b, unsigned int* data, int length, char* delim, char* fmt) 
    { 
     int i; 
     char s[50]; 
     b[0] = 0; 
     for(i = 0; i < length; i++) 
     { 
      s[0]=0; 
      sprintf(s, fmt, data[i], (i<length-1)?delim : ""); 
      strcat(b, s);  
     } 
     return b; 
    } 

을 한 후,

char buffer[128]; 
char formattedints[128]; 
sprintf("(%s)\n", format_uint_array(formattedints, array, 3, ", ", "%d%s")); 
+0

이 필요한's입니다 [0] = 0;'? – imreal

5

도움이 될하지 않는 한 va_list의 모든 요소를 ​​전달처럼 사용 루프에서 어쨌든 만들었습니다. 어쨌든 루프를 벗어날 수 없기 때문에, 당신은뿐만 아니라 같은 루프에서 인쇄를 할 수 있습니다

여기
int data[] = {12, 345, 6789, 101112}; 
char buf[128], *pos = buf; 
for (int i = 0 ; i != 4 ; i++) { 
    if (i) { 
     pos += sprintf(pos, ", "); 
    } 
    pos += sprintf(pos, "%d", data[i]); 
} 
printf("%s\n", buf); 

link to a demo on ideone이다.

2

없음 루프 :

#include <stdio.h> 

int array[3] = {1, 2, 3};  
char buffer[128]; 

char *array_to_str(char * str, int *array, unsigned int n) { 
    int r; 
    if (n == 0) return 0; 
    if (n == 1) r = sprintf(str, "%d", array[0]); 
    else  r = sprintf(str, "%d, ", array[0]); 
    array_to_str(str + r, array + 1, n - 1); 
    return str; 
} 

int main() { 
    printf("(%s)\n", array_to_str(buffer, array, 3)); 
    return 0; 
} 
+0

아마도 내 질문에 더 구체적이어야했습니다. 문자열의 형식은 반드시 "(% d, % d, etc)"일 필요는 없습니다. 이 방법으로 하위 문자열을 사용하여 한 번에 하나의 % d을 (를) 대체하는 아이디어를 얻을 수있었습니다. 감사! – Chirag