2011-10-05 74 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); 
相关问题