Tag: printf

如何根据参数列表validation用户提供的printf格式字符串?

我有一个数字列表,并希望为我的用户提供输入printf样式格式字符串的选项,以指定数字的输出方式。 如何根据参数列表validation用户提供的格式字符串? 格式错误的输入不应该使程序崩溃,我想避免任何格式字符串攻击。 我不关心validation是否仅处理POSIX或编译器特定超集中指定的格式选项。 是否有任何图书馆电话要求,或者我必须自己写吗? 澄清:我需要的是这样的: float var1, var2, var3, var4; // var1 .. var2 are given by the program const char * userSupplied = getFormatStringFromUser(); if( isValidFormat( userSupplied, “float”, “float”, “float”, “float” ) ) printf( userSupplied, var1, var2, var3, var4 ); else printf( “The format you gave was invalid!\n” ); 在这个例子中,我知道我有四个花车。 我想允许任何只引用0到4个浮点数的格式。 因此isValidFormat()应允许以下格式字符串: “%f%g%e%.1f” […]

关于C中的printf格式字符串

我们采取以下计划: #include int main() { long t =57 ; printf(“[%+03ld]”, t); } 它的输出: [+57] 我有点困惑:我告诉他将输出填充到宽度3( 03ld ),用零,但是似乎如果我强制输出在数字( + )之前加一个加号,它将不会添加所需的零如果数字的长度已经是2位数(如57中所示)。 对于数字<10,它填充1为零。 来自http://www.cplusplus.com/reference/cstdio/printf/ (0) – >当指定填充时,用零填充数字(0)而不是空格(参见width子说明符)。 (+) – >即使对于正数,也要在结果前加上加号或减号(+或 – )。 默认情况下,只有负数前面带有 – 符号。 (宽度) – >要打印的最小字符数。 如果要打印的值小于此数字,则结果将填充空格。 即使结果较大,也不会截断该值。 所以我只需要澄清……上面引用的(width)说明符指的是由此格式说明符( “%+03ld” )控制的输出字符串的全长(即:将要打印的字符)或要打印的数字的全长字符?

如何通过慢速CAN总线进行printf样式调试 – 在远程工具上使用常量字符串,而不是嵌入式系统

目前,在我的嵌入式系统(用C编码)中,我有很多调试辅助打印语句,当远程工具连接到可以向PC显示消息的系统时执行。 这些有助于理解一般系统状态,但由于消息通过慢速CAN总线,我相信它们可能会堵塞管道并导致其他问题,试图获取任何有用的数据。 它的基本要点是: 它就像一个printf,但最终采用特殊的消息格式,通过CAN总线从嵌入式系统发送到工具。 为此,我可以使用特殊的调试消息替换此通用打印消息,该消息向其发送唯一ID,后跟仅变量参数(即argc / argv)。 我想知道这是否是正确的方法,或者是否有一个我错过的魔法子弹,或者其他我没有想到的东西。 所以,我发现这个问题很适合我的目的: printf()使用字符串表“解码器环”调试库 但我没有限制使它像printf一样简单。 我可以在远程工具端维护一个字符串表(因为它是Windows可执行文件,因此不受代码大小限制)。 我是负责此代码的唯一负责人,并且希望在调试时尝试减轻代码大小以及CAN总线流量。 我现在的想法是这样的: printf(“[%d] User command: answer call\n”, (int)job); 这变成了 debug(dbgUSER_COMMAND_ANSWER_CALL, job); dbgUSER_COMMAND_ANSWER_CALL是可能的调试消息枚举的一部分 而遥远的一面有类似的东西 switch(messagetype) { case dbgUSER_COMMAND_ANSWER_CALL: /* retrieve an integer from the data portion of the message and put it into a variable */ printf(“[%d] User command: answer call\n”, (int)avariable); } 这是相对简单的,如果我的所有消息都采用相同的格式,那就太棒了。 […]

SIGSEGV,(貌似)由printf引起

首先,对任何交叉发布道歉。 希望我不是在这里重复一个问题,但我无法在其他地方找到这个问题(通过Google和Stack Overflow)。 这是错误的要点。 如果我在代码中的任何地方调用printf , sprintf或fprintf来显示浮点数,我会收到SIGSEGV (EXC_BAD_ACCESS)错误。 让我举个例子。 以下引发错误: float f = 0.5f; printf(“%f\n”,f); 此代码不: float f = 0.5f; printf(“%d\n”,f); 我意识到那里有隐含的转换,但我并不关心这一点。 我只是无法理解为什么打印浮点数而不是打印整数会产生错误。 注意:部分代码使用malloc来创建一些非常大的多维数组。 但是,这些打印语句不会以任何方式引用这些数组。 这是我如何声明这些数组的示例。 #define X_LEN 20 #define XDOT_LEN 20 #define THETA_LEN 20 #define THETADOT_LEN 20 #define NUM_STATES (X_LEN+1) * (XDOT_LEN+1) * (THETA_LEN+1) * (THETADOT_LEN+1) #define NUM_ACTS 100 float *states = (float *)malloc(NUM_STATES […]

什么是“无效的转换规范”?

根据C11 ,章节§7.21.6.1,P9 如果转换规范无效,则行为未定义。 282)如果任何参数不是相应转换规范的正确类型,则行为未定义。 到时候,我的理解是,为 char str [] = “Sourav”; 像printf(“%S”, str);这样的语句printf(“%S”, str); 属于第一句,没有CS为%S (大写) 像printf(“%d”, str);这样的语句printf(“%d”, str); 属于第二句(CS和参数类型不匹配,但%d 不是 “无效”CS,无论如何) 直到最近的评论post通知为止 。 我的理解错了吗? 第二个语句是否也可以归类为“无效”(PS-而非“错误”)转换说明符? 更新:删除答案和评论主题, 这里是 <10K用户的快照 。

C99 printf中的可变前导零

我在C99写了一个Multiprecision Library。 根据我的代码编译的平​​台,我选择不同的表示基础。 因此,例如,假设在平台X上系统选择BASE = 100; 在平台上Y BASE = 10000; 假设我代表大的unsigned int如下: typedef struct a { big_enough_uint *digits; unsigned int length; unsigned int last; } bigUint; 所以,当我在BASE-100系统上时,我想要我的打印function void my_print(bigUint *A){ unsigned int i=0; fprintf(stdout,”%d”,A->digits[0]); if(i!= A->last){ for(;ilast;i++) fprintf(stdout,”%02d”,A->digits[i]); } printf(stdout,”\n”); } 在BASE-10000系统上,我希望它是这样的 void my_print(bigUint *A){ unsigned int i=0; fprintf(stdout,”%d”,A->digits[0]); if(i!= A->last){ for(;ilast;i++) fprintf(stdout,”%04d”,A->digits[i]); } printf(stdout,”\n”); […]

无法将字符串复制到C中的字符串数组

我试图遍历我的链表并将每个节点字段组合成一个字符串,然后将字符串添加到字符串数组中。 void listToArray(){ //create array of strings char *list[numNodes]; int i = 0, n; while(head != NULL){ // add string to array printf(“[%d] %s %s:%d\n “, i, head->fileName, head->ip, head->port); n = sprintf(list[i], “[%d] %s %s:%d\n”, i, head->fileName, head->ip, head->port); head = head->next; printf(“%s\n”, list[i]); i++; } printf语句工作正常,这表明它不是导致问题的节点字段,但是当我执行我的sprintf语句将字符串复制到数组的索引中时。 我遇到了分段错误。

没有\ n的printf在放置之前不显示文本while(1)

可能重复: 除非换行符在格式字符串中,为什么printf在调用后不会刷新? (在C中) 我在做网络项目时遇到了这个问题。 我能够缩小问题的范围,并像这样重现: 如果您运行此代码,它将不会在屏幕上显示文本。 虽然如果你把\ n放在文本的末尾或者在printf语句之后使用fflush(),它会显示文本。 int main(){ printf(“started”) ; while(1){ } } 任何人都可以解释这种行为吗?

C / C ++:printf使用逗号代替点作为小数分隔符

我需要我的程序使用逗号作为小数分隔符显示输出。 根据这个链接: http : //www.java2s.com/Code/Java/Development-Class/Floatingpointwithcommasf.htm你可以在Java中使用这样的东西: System.out.printf(“Floating-point with commas: %,f\n”, 1234567.123); 是否有标志或其他东西我可以用来在C中有类似的行为? 提前致谢!

在C中预填充stdin

我的程序应该让用户编辑一行文件。 用户编辑该行并按Enter键将其发回。 因此,我想打印即将被编辑的当前行,但是在stdin而不是stdout上打印它。 我不知道如何解决的唯一问题是我如何预先填充标准输入。 我已经试过了: char cprefill[] = {“You may edit this line”}; char cbuffer[100]; fprintf(stdin, cprefill); fgets(cbuffer, 100, stdin); 这似乎是最简单的解决方案,但可能太简单了。 fprintf不会向stdin打印任何内容。 什么是正确的方法? 编辑: 这就是它应该是这样的。 请注意可以移动的光标。