使用 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
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