Sir*_*Guy 21 c printf gcc string-formatting gcc-warning
我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为
sprintf(someString, "");
Run Code Online (Sandbox Code Playgroud)
这解释了为什么这是警告(在gcc上使用-Wall)?我只是发现C标准允许零长度格式字符串.
我尝试了以下示例
#include <stdio.h>
int main()
{
char str[2] = {'a', 'a'};
sprintf(str, "");
printf("\'%c\'\'%c\'\n", str[0], str[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出来的
'''a'
Run Code Online (Sandbox Code Playgroud)
这正是我期望看到的.那么,为什么警告?
R..*_*R.. 23
GCC发出警告的事实通常与该构造是否合法C无关,而是GCC开发人员是否认为它可能表明您的意思不是您所写的内容,或只是不好的风格.这里有些例子:
if (x = 0)- 你几乎肯定意味着if (x == 0).printf(str)- 你几乎肯定是指fputs(str, stdout)或者printf("%s", str); 如上所述,代码非常危险.if (foo == bar & MASK)- 你几乎肯定意味着if (foo == (bar & MASK)).等等
在你的情况下,我认为海湾合作委员会质疑你为什么sprintf(String, "")要做相同的事情String[0]=0;(后者更短,更快,更清晰).
你收到警告是因为gcc知道第二个参数sprintf()应该是一个非空字符串,通常是一个具有各种格式规范的字符串 - 一个功能相同的,并且对你在代码中所做的那个"更合法"的调用将是sprintf(str, "%s", "").此外,几乎总有一到N个额外的参数,足以满足格式规范.当你在这里使用它时,你将它用作一种strcpy(),虽然技术上有效,但是使用标准库是一种非常奇怪的方式.
| 归档时间: |
|
| 查看次数: |
11572 次 |
| 最近记录: |