1

I am using sscanf in my project to copy strings from source buffer to target buffer. For example:

char* target;
target = (char*)malloc(100 * sizeof(char));
char* source = "Hello World";
sscanf(source, "%[^\t\n]", target); // trying to copy "Hello World" into target.
printf("%s\n", target);//this will print "Hello World".

But this way of coding style is not accepted. What my manager want me to do is something like:

sscanf(source, "%11[^\t\n]", target); // NOTE: I've written "%11". here, 11 == length of hello world.

That means, he want me to provide format specifiers as well. (%11 in this case).

But, the problem is that source can be of varying length and I don't know how to write the correct format specifier for every varying length string.

4

4 回答 4

7

利用:

sscanf(source, "%*[^\t\n]", maxlen, target)

其中 maxlen 是您要读取的大小。

似乎没有简单的方法可以使格式字符串sscanf(或其任何兄弟)采用输入字符串的任意最大长度。该建议基于与printf正交scanf,但事实并非如此。

您可能会发现使用strtokstrncpystrdup复制令牌会更好。

但是,既然它被标记为 C++,为什么不使用:

std::stringstream ss(source);  
std::string target;
getline(ss, target, "\t");
于 2013-08-23T11:34:52.467 回答
0

对于复制字符串使用strcpy(). 它不分配空间,因此您也必须提供第二个缓冲区。还有strncpy()一个不会复制超过指定的字符。

如果你想一次性复制一个字符串,你可以使用strdup(),只是不要忘记之后释放内存。

于 2013-08-23T11:33:30.823 回答
0

首先,为此使用 strcpy()。

其次,格式说明符只是一个字符串,因此只需在获取所需字符串的 strlen() 后使用 sprintf() 即可。

于 2013-08-23T11:33:41.977 回答
0

使用target = strdup(source)或如果仍然有义务使用sscanf()

动态创建格式。

const char* source = "Hello World";
size_t n = 10;  // See note below
char* target;
target = (char*) malloc(n);  // (char *) is needed for C++, but not C
char format[1+20+5+1];
sprintf(format, "%%" "%zu" "[^\t\n]", n - 1);
sscanf(source, format, target); // trying to copy "Hello World" into target.
printf("%s\n", source);//this will print "Hello World".
printf("%s\n", target);//this will print "Hello Wor".

您可能会想要n = strlen(source) + 1,但上面说明了动态创建的格式说明符如何scanf()防止缓冲区溢出target

于 2013-08-23T12:50:40.177 回答