以下代码导致错误并导致我的应用程序死亡.这是有道理的,因为缓冲区只有10个字节长,文本长度为22个字节(缓冲区溢出).
char buffer[10];
int length = sprintf_s( buffer, 10, "1234567890.1234567890." );
Run Code Online (Sandbox Code Playgroud)
我如何捕获此错误,以便我可以报告它而不是崩溃我的应用程序?
编辑:
阅读下面的评论后,我选择_snprintf_s.如果它返回-1值,则缓冲区未更新.
length = _snprintf_s( buffer, 10, 9, "123456789" );
printf( "1) Length=%d\n", length ); // Length == 9
length = _snprintf_s( buffer, 10, 9, "1234567890.1234567890." );
printf( "2) Length=%d\n", length ); // Length == -1
length = _snprintf_s( buffer, 10, 10, "1234567890.1234567890." );
printf( "3) Length=%d\n", length ); // Crash, it needs room for the NULL char
Run Code Online (Sandbox Code Playgroud) 我正在研究这个程序,我注意到使用%f表示double,%d表示float,这给了我一些完全不同的东西.谁知道为什么会这样?
int main ()
{
float a = 1F;
double b = 1;
printf("float =%d\ndouble= %f", a, b);
}
Run Code Online (Sandbox Code Playgroud)
这是输出
float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
Run Code Online (Sandbox Code Playgroud) 我想将unsigned int格式化为带有前导零的8位长字符串.
这是我到目前为止:
unsigned int number = 260291273;
char output[9];
sprintf(output, "%x", number);
printf("%s\n", output); // or write it into a file with fputs
Run Code Online (Sandbox Code Playgroud)
打印"f83bac9",但我想要"0f83bac9".我怎样才能实现格式化?
从PHP API参考:
string sprintf (string $ format [,mixed $ args [,mixed $ ...]])
返回根据格式化字符串格式生成的字符串.
可以$args是一个数组 - 如果是这样我将如何使用它?
在XCode Organizer中,控制台 - 我可以读取NSLog输出,但不是printf().这是否可以printf()在真实设备上读取结果,就像在模拟器中一样?
我试着printf用一些重音字符,例如á é í ó ú:
printf("my name is Seán\n");
DEVC++ IDE中的文本编辑器显示它们很好 - 即源代码看起来很好.我想我需要一些其他库stdio.h,也许还有一些正常的变体printf.
我正在使用在Windows XP上运行的IDE Bloodshed DEVC.
我正在尝试将现有数据从MySQL数据库导出到我可以运行的ruby命令中rake db:seed.
这是我的代码.
# Generate db:seed data for proveedores.
$proveedores = R::findAll('tbproveedores');
$proveedoresE = R::exportAll($proveedores);
foreach ($proveedoresE as &$p) {
$line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"\n';
$exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website']);
var_dump($exportedLine);
fwrite($seeds, $exportedLine);
echo "<br />";
}
Run Code Online (Sandbox Code Playgroud)
注意\n$ line变量末尾的换行符号.我在网上看到这就是使用新行所需要的全部内容.
我上面代码的输出是(vertabim,一条长行):
BookSupplier.create(company: "Pearson", city: "Lima", country: "Peru", address: "Av. Limon", telephone: "4673535421", contact: "Javier", email: "", …Run Code Online (Sandbox Code Playgroud) 所以我有一个字符串,它有一定的字节数(或长度).我说字节是因为字符串末尾没有NULL终止符.虽然,我知道字符串有多长.通常,正如我们所知,当你printf("%s", str);,它将继续打印每个字节,直到它变为NULL字符.我知道没有C字符串不是NULL终止,但我有一个奇怪的情况,我存储的东西(不是特定的字符串),我不存储NULL,但"事物"的长度.
这是一个小样本:
char* str = "Hello_World"; //Let's use our imagination and pretend this doesn't have a NULL terminator after the 'd' in World
long len = 5;
//Print the first 'len' bytes (or char's) of 'str'
Run Code Online (Sandbox Code Playgroud)
我知道你可以这样做:
printf("%.5s", str);
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我很难对5进行编码,尽管在我的情况下,5是在变量中.我会做这样的事情:
printf("%.(%l)s", len, str);
Run Code Online (Sandbox Code Playgroud)
但我知道你做不到.但是让你知道我想要完成的事情.
我通过quora答案看到了这个程序
#include<stdio.h>
int main() {
printf("%d\n", ( { int n; scanf("%d", &n); n*n; } ));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是如何工作的,如果这符合标准?
我最近读过这篇文章
unsigned char x=1;
printf("%u",x);
Run Code Online (Sandbox Code Playgroud)
由于格式说明符%u,因此调用未定义的行为,printf需要unsigned int.但我还是想了解这个例子中发生了什么.
我认为整数推广规则适用于表达式printf("%u",x)
和由...表示的值x.
A.6.1整体推广
无论是否有符号,都可以使用字符,短整数或整数位字段,或者枚举类型的对象,可以在任何可以使用整数的表达式中使用.如果int可以表示原始类型的所有值,则该值将转换为int; 否则该值将转换为unsigned int.这个过程称为整体推广.
"可以使用"是什么意思?这是否意味着"在句法上是正确的"还是"定义的行为"?
在这个例子中如何推广x?我已经读过它被提升为一个int,但是如果printf("%u", (int x))仍然是未定义的行为那么我真的不明白为什么......
c printf variadic-functions undefined-behavior integer-promotion