在C中我们有一个声明如下:
printf("%6.3f ",floatNumber);
Run Code Online (Sandbox Code Playgroud)
这限制了打印时的位数.
我怎样才能实现类似的行为C++?我知道,setprecision但这并没有帮助我做同样的事情.
我想使用printf、fprintf等将 C 风格代码重构为 C++。是否std::format容易受到格式字符串攻击,如前面提到的 C 函数?
如果我搜索格式字符串攻击,我发现的只是stdio 格式字符串漏洞。我想更多地了解是否std::format容易受到攻击,以及如何缓解它,即使我必须格式化用户提供的字符串。
我希望我Label使用这种{0:c2}格式; 但是,当我按照以下方式执行时似乎不起作用:
客户代码:
<asp:Label ID="Label4" runat="server" Text="Label" StringFormat="{}{0:c2}"></asp:Label>
Run Code Online (Sandbox Code Playgroud)
服务器代码(在页面加载时):
Dim dvSql7 As DataView = DirectCast(SqlDataSource7.Select(DataSourceSelectArguments.Empty), DataView)
For Each drvSql7 As DataRowView In dvSql7
Label4.Text = drvSql7("goal").ToString()
Next
Run Code Online (Sandbox Code Playgroud)
可能是什么问题?在此先感谢您的帮助.
我正在研究Euler#3(http://projecteuler.net/problem=3).我认为我的逻辑是正确的,但是在尝试使用scanf(和printf)时遇到错误.我目前正在尝试使用%li,这是我得到的错误:
euler3.c: In function ‘main’:
euler3.c:30: warning: format ‘%li’ expects type ‘long int **’, but argument 2 has type ‘long int’
euler3.c:30: warning: format ‘%li’ expects type ‘long int *’, but argument 2 has type ‘long int’
Run Code Online (Sandbox Code Playgroud)
我理解错误,但对于我的生活,我找不到解决方案.如果需要,这是我的代码.
#include <stdio.h>
long greatestPrime(long num)
{
int i;
for(i = 2; i <= num; i++)
{
if(num%i == 0)
{
num = num/i;
i--;
}
}
return num;
}
int main(int argc, char *argv[])
{
unsigned long greatest;
printf("Enter number …Run Code Online (Sandbox Code Playgroud) 我的问题是从安全角度来看.我正在清理一些代码,我发现当前的代码有一个不受控制的格式字符串漏洞; 它传递一个字符串,printf()如:
void print_it(char * str)
{
printf(str);
Run Code Online (Sandbox Code Playgroud)
这显然被认为是不安全的编程,即使gcc通常会至少给你一些警告:
警告:格式不是字符串文字,也不是格式参数
现在要"修复"这个问题,我们可以确保你得到的东西被视为一个字符串
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)
但是我想知道在使用长度特定器时是否有任何额外的安全性.就像是:
printf("%.*s", (int)sizeof(str), str);
Run Code Online (Sandbox Code Playgroud)
我想不出有什么理由会更加安全,但如果我遗漏了一些明显的东西,我也不会感到惊讶.
打印十六进制值(%x)和地址(%p)时,格式略有不同.0x在十六进制值的情况下,打印值不会以:
int main()
{
int x = 0x1234;
printf("Value of x: %x\n", x);
printf("Address of x: %p\n", (void*)&x);
}
Run Code Online (Sandbox Code Playgroud)
收益率(gcc):
Value of x: 1234
Address of x: 0xffb0fbfc
Run Code Online (Sandbox Code Playgroud)
为什么0x在地址的情况下强迫你呢?
我想它归结为标准.
0x如果没有我想要的话,打印地址的正确方法是什么?这%p不仅是%x一个附加的0x权利吗?
这个简单的方法只是创建一个动态大小为 n 的数组,并用值 0 ... n-1 对其进行初始化。它包含一个错误,malloc() 仅分配 n 而不是 sizeof(int) * n 字节:
int *make_array(size_t n) {
int *result = malloc(n);
for (int i = 0; i < n; ++i) {
//printf("%d", i);
result[i] = i;
}
return result;
}
int main() {
int *result = make_array(8);
for (int i = 0; i < 8; ++i) {
printf("%d ", result[i]);
}
free(result);
}
Run Code Online (Sandbox Code Playgroud)
当您检查输出时,您会发现它会按预期打印一些数字,但最后的数字是乱码。然而,一旦我在循环中插入 printf() ,输出就出奇地正确,尽管分配仍然是错误的!是否有某种与 printf() 相关的内存分配?
据我所知,在赋值之前有一些关于引用的帖子有增量.
但是,我看到格式字符串的类似问题.
greeting = "hello, {}"
def printHello(name):
greet = greeting.format(name)
print(greet)
printHello("Erica")
Run Code Online (Sandbox Code Playgroud)
我有local variable 'greet' referenced before assignment.
任何人都可以解释为什么会这样吗?
此外,此错误偶尔会发生,因此它不具有确定性......
我认为global greeting会解决这个问题吗?
==编辑==
我发现错误来自一个库而不是我的代码抱歉混淆
printf()当我们在没有格式说明符的情况下向它提供多个参数时,它的行为是什么?
例子:
int main()
{
printf("hello", "hi");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器在编译上述程序时会产生警告?:
warning: too many arguments for format [-Wformat-extra-args]
Run Code Online (Sandbox Code Playgroud)
如果我们编译如下类似的程序:
int main()
{
char *s1 = "hello";
char *s2 = "hi";
printf(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)
不产生警告。这是什么原因?
另外,为什么两个程序hello都只输出而不打印hi?
我可以使用带有printf等格式字符串的c ++ iostream类吗?
基本上,我希望能够做到这样的事情: -
snprintf (inchars, len, "%4f %6.2f %3d \n", float1, float2, int1);
Run Code Online (Sandbox Code Playgroud)
很容易使用stringstreams.是否有捷径可寻?