我已阅读帖子sprintf format specifier replace by nothing和其他相关,但没有看到具体解决这个问题。sprintf()是否需要格式说明符才能正常工作?
直到今天,我从来没有见过sprintf
只用了2个参数。
我的系统使用sprintf()
原型为:
int sprintf (char Target_String[], const char Format_String[], ...);
虽然有一些遗留代码,我碰到这个跑工作:(简化图)
char toStr[30];
char fromStr[]={"this is the in string"};
sprintf(toStr, fromStr);
我的原型的解释是,第二参数应由const char[]
组成,并接受标准ansi C格式说明符such as these。
但上面的例子似乎工作得很好,字符串fromStr
作为第二个参数。
这是纯粹的未定义的行为,这是行之有效的?或者这种用法是完全合法的吗?
我正在使用C99编译器在Windows 7上工作。
出于不同的原因,我想说的代码是附近的一个错误 - 我期望'字符fromStr [] = {“this is in string”};'应该是'char fromStr [] =“这是字符串”;'(no'{}')。代码确实编译,因为我确信OP的意图,但对我来说,它看起来像'char fromStr [] = {“这是在字符串”};'应该建立一个数组1'char'的指针值转换为一个'char'。我猜这是对的,但看起来错了 – chux
@chux - 有趣的。我正在寻找同样的道路,试图发现哪些失败模式,如果有的话我可以找到。 (类似于_format字符串attack_,在下面的评论中提到)。我尝试用'= {“%这是在字符串”};'中出现与_unknown specifier_错误,然后再用'= {“%cthis是字符串”};',这是因为%c是一个已知的说明符,用_参数不足_出错。这两者似乎都支持下面答案的真相。至于使用'{“...”};'方括号,它们不会对我造成任何问题。 – ryyker