2014-10-01 62 views
0

我會嘗試在這裏儘可能清楚,但基本上。 (我在c做這個) 我有一個數組(動態)的unsigned long long int,它是從while循環中增長的。 這些工作並不是什麼奇特的東西,但我有一些getter函數可以根據問題提供信息。詮釋數組中的字符串在c

即,獲得前20個號碼。這將返回一個長度爲20個元素的無符號long long int數組。

因此用戶將選擇返回數組中的元素數量,因此它可能是1或它可能是20個大數字(即array [] =(1233,123444,1234124,1243124,...) )

我需要的是爲一個字符串。我把那成UDP數據包。 我與sprintf的玩弄,但我沒有C專家,所以任何幫助將是非常美妙的。

謝謝!

+1

檢查的sprintf'的返回值()'有多少字符打印。 – timrau 2014-10-01 01:22:55

+0

期望輸出字符串的確切格式是什麼? – 2014-10-01 01:34:25

回答

2

最有效的方法是將每個元素迭代爲snprintf到緩衝區中。

這是一個模擬Python的join()的函數。

#include <stdio.h> 

#define ARRAY_LEN(x)   (sizeof(x)/sizeof(x[0])) 

/** 
* Print an array of unsigned long long integers to a string. 
* Arguments: 
* buf  Destination buffer 
* buflen Length of `buf' 
* ar  Array of numbers to print 
* arlen Number of elements in `ar' 
* sep  Separator string 
* Returns: 
* The number of bytes printed 
*/ 
int join_ull(char *buf, int buflen, 
    unsigned long long ar[], int arlen, const char *sep) 
{ 
    int i; 
    char *p; 
    const char *end = buf + buflen; 

    /* While we have more elements to print, and have buffer space */ 
    for (i=0, p=buf; i<arlen && p<end; ++i) { 
     p += snprintf(p, end-p, "%llu%s", ar[i], 
      (i<arlen-1) ? sep : "");  /* Print separator if not last. */ 

     /* Note that p is advanced to the next place we want to print */ 
    } 

    return p-buf; 
} 


int main(void) 
{ 
    unsigned long long ar[] = {1, 2, 3}; 
    char buf[1024]; 

    join_ull(buf, sizeof(buf), ar, ARRAY_LEN(ar), " "); 
    printf("Output: \"%s\"\n", buf); 

    /* Test the buffer-too-small case */ 
    join_ull(buf, 4, ar, ARRAY_LEN(ar), " "); 
    printf("Output: \"%s\"\n", buf); 

    return 0; 
} 

結果:

Output: "1 2 3" 
Output: "1 2" 
+0

優雅!只是詳細說明在問題中提到的'('')' – chouaib 2014-10-01 01:32:26

+0

@chouaib不確定OP *實際*是否需要'()'。 – 2014-10-01 01:34:41

+0

哈...好吧,那是行得通的,不過我只有一半瞭解它,但我會惹惱它的。非常感謝你! – beasts 2014-10-01 01:34:46