2011-10-05 109 views
0

我想將一個字符串分成4個部分。我需要的基本上是這樣的:C將一個字符串分成4個變量

sscanf(string, "%d %d %d %[^\n]", id1, id2, id3, restOfString);

的VAR restOfString是一個char * 問題:restOfString必須指向的內存可能仍然在最小的空間內包含由%[^ \ n指示的所有字符串]。

我只想了解asprintf的功能。它有一個內部malloc(),用於創建打印字符串所需的內存空間。我想用sscanf()的相同技術。我怎麼能做到這一點?我怎麼知道sscanf()會讀取的字符串的大小?

回答

3

我完全同意RushPL約沒有打擾到微優化內存。在更普遍的情況下,雖然,你可能有一個大的字符串,比較小的restOfString,下面的別名restOfString到主字符串的方法:

// char *string, *restOfString; 
// int id1, id2, id3, id4; 
int result, numStored; 
result = sscanf(string, "%d %d %d %d %n", &id1, &id2, &id3, &id4, &numStored); 
if (result == 4) 
    restOfString = string + numStored; 
else 
    restOfString = 0; 

基本上,使用%N抓住當前位置,同時解析,然後用它作爲原始字符串的偏移量。請注意,%n是一個說明符,極有可能是如果不小心使用,會導致格式字符串漏洞。如果你正在做複雜的解析,你不應該使用scanf和朋友。

+0

我不知道'%n'說明符,但開始思考一個類似的解決方案,並在編輯中提出了以下建議。謝謝! – RushPL

+0

謝謝。這將會很好。有了這個,我可以按我的意願工作。我不需要複製所有的字符串,我只需要它的一部分,這將允許我這樣做。 – brunoais

2

只要使用char* restOfString = malloc(strlen(string));如果整個字符串的其餘部分太大而無法放入堆棧,則少量額外的字節無關緊要。獲得準確的malloc大小將是反生產力。

或者,如果我可以建議,你可以完全忽略分配(但它取決於你的需要)。由於sscanf返回讀取的元素數量和註釋字節數,您可以手動查找字符串其餘部分的位置。不漂亮,但應該工作。

// sscanf 
sscanf(string, "%d %d %d"); 
const char* restOfString = strchr(strchr(strchr(string, ' ') + 1, ' ')+1, ' ')+1; // third ' ' +1 gives rest of string 

或者,你可以用得到確切的分配:

char* restOfStringAlloced = strdup(restOfString); 
相關問題