Tag: printf

在C中编写宏时,如何找到参数的类型和printf说明符?

我想用宏来扩展minunit更有用。 #define mu_assert_equal(actual, expected) do { \ if (actual != expected) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf(“malloc failed”); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, “required: %s != %s, reality: %s == %lu”, \ #actual, #expected, #actual, actual); \ return message; \ } \ } while (0) 调用: mu_assert_equal(bytes_parsed, 1); […]

snprintf错误。 sizeof的参数与destination相同

gcc 4.8在构建时给我一个错误 #include #include static inline void toto(char str[3]) { snprintf(str, sizeof(str), “XX”); } int main(){ char str[3]; toto(str); return 0; } 这是gcc错误 错误:’snprintf’调用中’sizeof’的参数与目标的表达式相同; 你的意思是提供一个明确的长度? 注意:我使用-Wall -Werror标志将警告转换为错误。 这里有类似的东西在评论中,有人回答了这个问题 “对于固定长度的缓冲区,我通常使用strncpy(dest,src,sizeof(dest)); dest [sizeof(dest)-1] =’\ 0′;这保证了NULL终止,并且比snprintf更麻烦,更不用说了很多人都使用snprintf(dest,sizeof(dest),src);相反,当他们的程序任意崩溃时会非常惊讶。“ 但这是错误的:gcc 4.8说 “错误:’strncpy’调用中’sizeof’的参数与目标的表达式相同;你的意思是提供显式长度吗?[-Werror = sizeof-pointer-memaccess]” 在gcc 4.8文档中,他们正在讨论这个问题 :他们说: -Wall的行为已更改,现在包含新警告标志-Wsizeof-pointer-memaccess。 这可能会导致代码中的新警告与以前版本的GCC一起干净地编译。 例如, include string.h struct A { }; int main(void) { A obj; […]

vsnprintf和gcc

我有以下声明: vsnprintf(target, size – 1, “%ls_%ls”, str16_1, str16_2); 为什么这会在gcc上失败? 我在Windows上使用过这样的: vsnprintf(target, size – 1, “%S_%S”, str16_1, str16_2); 它按预期工作。 在gcc文档中我发现%S是%ls的同义词,但我不能使用它。 我也试过%S,但是没有用。 我在具有可变参数列表的函数中使用它。 有可能无法工作,因为我更改了传递给va_start的格式变量吗? 我必须搜索%S并将其替换为格式变量中的%ls。 function如下: void f(const char* format, …){ char* new_format = format with %S replaced with %ls; va_list argptr; va_start(args, format); vsnprintf(str, size-1, new_format, argptr); } 我查了一下,new_format是正确的。 谢谢!

strcat()用于格式化字符串

我正在我的程序中逐个构建一个字符串,当我在末尾添加一个简单的字符串时,我正在混合使用strcat(),但是当我添加一个格式化字符串时,我正在使用sprintf()例如: int one = 1; sprintf(instruction + strlen(instruction), ” number %d”, one); 是否可以使用strcat()连接格式化的字符串或者首选方法是什么?

_Bool的printf转换说明符?

使用printf() ,我可以将%hhu用于unsigned char ,将%hi用于short int ,将%zu用于size_t ,将%tx用于ptrdiff_t等。 我对_Bool使用什么转换格式说明符? 标准中是否存在一个? 或者我必须像这样投射: _Bool foo = 1; printf(“foo: %i\n”, (int)foo);

AIX上的asprintf的替代或解决方法

我正在尝试在AIX上构建python-kerberos。 kerberospw.c使用了对asprintf的调用,但是从谷歌告诉我的情况来看,AIX上不存在asprintf。 我看到http://www.koders.com/c/fidAA9B130D588302673A28B568430A83131B7734C0.aspx?s=windows.h ,看起来我可以创建一个替代asprintf,但我不知道这会发生什么,或者我会怎么做#include它在kerberospw.c中。 有没有办法可以使用koders.com示例或其他一些代码“伪造”asprintf? 我可以只包含asprintf函数,如kerberospw.c所示? 我不是C编码员,但是 asprintf(char ** resultp,const char * format,…) 用最后的圆点看起来对我来说不是一个有效的签名。 来自kerberospw.c的相关行如下 asprintf(&message,“%。* s:%。* s”,(int)result_code_string.length, (char *)result_code_string.data, (int)result_string.length, (char *)result_string.data); 我知道我可以联系python-kerberos的作者,但是a)我认为如果我这样做有一个潜在的补丁是有帮助的,并且b)我可能会运行其他使用asprintf的软件,它会是很高兴有一个解决方法。

如何使用printf制作“进度条”?

许多命令行工具实现了基于文本的进度条。 像rpm安装一样: 安装############## [45%] #随着百分比的增长而增长,同时保持一条线 。 我想要的是类似的东西:我需要一个只需一行的进度指示器,也就是说,当百分比增长时,它被覆盖,而不是创建一个新行( \n )。 我试过这个: #include int main (){ int i = 0; for (i = 0; i < 10000; i++){ printf("\rIn progress %d", i/100); } printf("\n"); } \r工作覆盖单行。 但是, \r将光标移到行的开头, printf将光标移到末尾,这导致光标快速波动。 你们可以通过一点编译来感受它。 任何人都可以提出替代方案来避免这个问题吗?

将原始数据打印到固定长度的hex输出

我有一个结构,指向结构的指针,我希望将前n个字节作为长hex数字打印,或者作为hex字节的字符串。 基本上我需要printf等效的gdb的检查内存命令,x / nxb。 如果可能的话,我仍然希望使用printf作为程序的记录器function,只是它的变体。 如果我可以在不循环数据的情况下这样做,那就更好了。

奇怪的printf输出

我执行了以下代码 #include int main() { printf(“%f\n”, 9/5); } 输出: 0.000000 为什么不1 ? 如果我写printf(“%f %f %d %d\n”, (float)9/5, 4, sizeof(float), sizeof(int)); 然后输出是1.800000 0.000000 4 59 为什么不1.800000 4 4 4 在我的机器上, sizeof (float)是4 提前致谢

Posix是否为printf / scanf提供格式字符串宏?

printf和scanf系列函数使用了少数与基本数据类型相对应的原始格式说明符 – %d表示int , %llu表示unsigned long long int等。 但是,有很多标准化的类型别名需要在实践中使用,例如int32fast_t ,而且不能也不应该知道底层的基本类型。 对于stdint.h的别名,C标准谢天谢地指定了一组宏来生成相应的格式字符串,如PRI32 ,在inttypes.h 。 Posix有一组类似的宏吗? Posix有大量的不透明类型,如ssize_t , pid_t , rlim_t , suseconds_t等,它们都是基本整数类型的变体。 如何在格式字符串中可移植地使用这些类型?