Tag: printf

从C中的变量构建字符串

我正在研究一个使用套接字的简单的二十一点游戏,由我的操作系统类提供。 我们得到了一个套接字接口,它已经来回传递一个字符数组。 我希望我能做到这样的事情: char[] msgOut = printf(“Dealer’s Card is %C %C”, char1, char2); sendMsg(msgOut); 然而 ,谷歌搜索引导我确定printf的返回值是Char的输出数量的int, 而不是 chars本身的char [](正如我所希望的那样)。 是否有另一个C函数可以让我从变量中构建字符串?

sprintf_s缓冲区太小

以下代码导致错误并杀死我的应用程序。 这是有意义的,因为缓冲区只有10个字节长,文本长度为22个字节(缓冲区溢出)。 char buffer[10]; int length = sprintf_s( buffer, 10, “1234567890.1234567890.” ); 我如何捕获此错误,以便我可以报告它而不是崩溃我的应用程序? 编辑: 阅读下面的评论后,我选择_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, […]

将未知长度的格式化数据写入字符串(C编程)

以下C函数: int sprintf ( char * str, const char * format, … ); 将格式化数据写入字符串。 作为str传递的数组的大小应该足以包含整个格式化的字符串。 但是,如果提前知道格式化字符串的长度怎么办? 如何使用此function(或类似其他function)写入格式化数据,其长度未知? 例如: #include int main () { char buffer [13]; int n, a=5, b=3; n=sprintf (buffer, “%d plus %d is %d”, a, b, a+b); printf (“[%s] is a %d char long string\n”,buffer,n); return 0; } 缓冲区需要为13或更大才能使其正常工作。 如果字符串长度未知,并且缓冲区(例如)已设置为5,则此操作无效。 我需要能够为碰巧比缓冲区大的字符串动态分配或重新分配缓冲区的东西。

包装器printf函数根据用户首选项进行过滤

我的程序写入日志和stdout。 但是,每条消息都有一定的优先级,用户在Preferences中指定哪个优先级转到哪个流(log或stdout)。 unsigned short PRIO_HIGH = 0x0001; unsigned short PRIO_NORMAL = 0x0002; unsigned short PRIO_LOW = 0x0003; 首选项由一些标志处理: unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); unsigned short PRIO_STD = (PRIO_HIGH); write_log函数应该使用与printf函数相同的参数,并添加unsigned short priority参数。 write_log((PRIO_NORMAL|PRIO_LOW), “HELLO %s, take %d”, “World”, 1); (即使PRIO_NORMAL|PRIO_LOW没有意义……) 检查标志很简单: if(priority & PRIO_LOG) (如果在两个参数中都设置了任何标志,则返回> 1) 但是,我不知道如何将字符串文字和格式参数传递给printf函数。 任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)? 非常感谢。

为什么打印0(零)而没有使用C打印格式“%#x”的前导“0x”?

背景:我有许多脚本通过查找前导“0x”来解析查找hex数的日志文件。 我们的嵌入式C库改为新的printf。 新的printf比我们之前更符合标准,我的脚本破了。 在Linux机器上: #include int main( void ) { printf( “%#010x\n”, 0 ); printf( “%#010x\n”, 1 ); return 0; } 输出(使用glibc)是: 0000000000 0x00000001 我们公司的输出是: 0x00000000 0x00000001 从printf(3)开始,在’#’标志字符上:“对于x和X转换,非零结果的前缀为字符串”0x“(或X转换为”0X“)。” 我很好奇为什么 。 如果没有挖掘C标准文件或为标准委员会成员购买午餐,为什么不在零价值论证中使用前导0x?

特定的Cfunction如何工作?

我正在努力学习C并且我已经非常困惑了。 在我使用的OOP语言中,存在执行方法重载的能力,其中相同的函数可以具有不同的参数类型并且调用哪个是最合适的。 现在在C中我知道情况并非如此,所以我无法弄清楚以下问题,printf()如何工作。 例如: char chVar = ‘A’; int intVar = 123; float flVar = 99.999; printf(“%c – %i – %f \n”,chVar, intVar, flVar); printf(“%i – %f – %c \n”,intVar, flVar, chVar); printf(“%f – %c – %i \n”,flVar, chVar, intVar); 现在因为C不支持函数重载,printf如何设法获取任何类型的任意数量的参数,然后正确地使用它们? 我试图通过下载glibc源程序包找到printf()工作,但似乎很容易找到它,虽然我会继续寻找。 这里的任何人都可以解释C如何执行上述任务吗?

可以在printf中使用指向字符串的指针吗?

我想的是: #include #include #include int main(void) { //test pointer to string char s[50]; char *ptr=s; printf(“\nEnter string (s): “); fgets(s, 50, stdin); printf(“S: %s\nPTR: %s\n”, s, *ptr); system(“PAUSE”); return 0; } 或者我应该使用带*(s + i)的for循环和格式说明符%c? 这是通过指针和简单的printf打印字符串的唯一可能方法吗? 更新:printf使用数组的第一个元素的地址进行操作,所以当我使用* ptr时,我实际上是使用第一个元素而不是它的地址。 谢谢。

如何填充printf以考虑负号和可变长度数?

我试图在日志文件中输出一些数字,我想通过printf函数填充一大堆浮点数来产生: 058.0 020.0 038.0 -050.0 800.0 150.0 100.0 目前我这样做: printf(“% 03.1f\n”, myVar); …其中myVar是一个浮点数。 该语句的输出如下所示: 58.0 20.0 38.0 -50.0 800.0 150.0 100.0 根据我的阅读,我希望我的代码能够生成我在本文顶部提到的输出,但显然有些不对劲。 你一次只能使用一面旗帜吗? ..或者还有什么东西在这里发生?

如何在C中打印没有库函数的变量的charcater,字符串或值?

例如,如果我不应该使用像printf,putchar这样的标准库函数,那么如何轻松地将字符打印到屏幕上。 有没有简单的方法来做到这一点。 我不太了解系统调用,如果我必须使用它们,那怎么样? 那么任何一个建议都可以轻松打印而不使用库函数?

在C中打印void *变量

大家好我想用printf进行调试。 但我不知道如何打印“out”变量。 在返回之前,我想打印此值,但其类型为void *。 int hexstr2raw(char *in, void *out) { char c; uint32_t i = 0; uint8_t *b = (uint8_t*) out; while ((c = in[i]) != ‘\0’) { uint8_t v; if (c >= ‘0’ && c = ‘A’ && c = ‘a’ || c <= 'f') { v = 10 + c – 'a'; } […]