使用 sscanf() ==> "data argument not used by format string" 的可变字符串限制“%*s”

Variable string limit "%*s" with sscanf() ==> "data argument not used by format string"

int y = strlen(target);
sscanf(p,"%*s",y,buffer);

为什么上面的代码会导致 warning: data argument not used by format string ??

编译为 Apple clang version 11.0.0 (clang-1100.0.33.17)

目标:将与字符串target相同数量的字符放入字符串buffer,其中p是一个char * 指向字符串的某个元素。

对于 sscanf()"%*s" 中的 * 是参数抑制,而不是大小。

sscanf(p,"%*s",y,buffer); 只是扫描 p 寻找 non-white-space 字符串而不保存任何内容。 y, buffer 未使用。


建议研究fgets()

我相信你想要

#include <string.h>

memcpy(buffer, p, strlen(target));

请注意,这不会添加终止 NUL。这可以通过以下方式实现:

#include <string.h>

size_t len = strlen(target);
memcpy(buffer, p, len);
buffer[len] = 0;

其他答案解释说 sscanf 不提供从参数中获取字段宽度。但是关于这个:

Aim : To get the same number of characters as in a string target into the string buffer, where p is a char * pointing to some element of a string.

I/Osscanf()等函数是比较重量级的。如果您只想将一个字符串(的一部分)复制到另一个字符串,那么 memcpy()strncpy() 更适合这项任务。或 strncat(),其属性使其在这个特定任务中优于其他两个,因为有了它,您就没有 memcpy() 会带来的超出源字符串的风险,或者需要手动确保memcpy()strncpy() 的结果终止。示例:

*buffer = '[=10=]';         // start with an empty string
strncat(buffer, p, y);  // concatenate the wanted region of the source string