天道酬勤,学无止境

printf

Integer conversion to Hexadecimal String in C without (sprintf/printf libraries) [duplicate]

问题 这个问题在这里已经有了答案: 如何在 C 中将整数转换为十六进制字符串? (7 个回答) 4年前关闭。 我有这些输入变量: uint16 temperature = 0x1f12; uint8 array[8] = {0,0,0,...0} 我想拥有 array8[0] = '1'; array8[1] = 'f'; array8[2] = '1'; array8[3] = '2'; array8[4] = '\0'; array8[5] = '\0'; array8[6] = '\0'; array8[7] = '\0'; 但是,对于内存问题(我正在使用微控制器!)我需要避免使用 sprintf、printf、puts 等功能。 我应该怎么做? 最好的祝福, 回答1 此代码仅使用堆栈中的 8 个附加字节( int i, j )。 int i; for (i = 0; i < 8; i++) { array[7 - i] = temperature % 16; temperature /= 16; if (temperature == 0) break; } if (i == 8) i--; int j; for (j = 0; j <= i; j++) array[j] = array[7 - i + j]; for (j = i + 1; j < 8; j++)

2022-05-17 04:31:07    分类:技术分享    c   printf

Precision field in printf when formatting integer

问题 当我执行这两行时: printf("%.5d\n", 3); // use of precision filed printf("%05d\n", 3); // use of 0 flag to prepend with 0 我得到以下输出: 00003 00003 同样的结果 所以我想知道整数类型的精度字段是什么意思 回答1 对于%d ,精度是要打印的最小位数。 从手册页: 精度可选精度,形式为句点 ('.'),后跟可选的十进制数字字符串。 而不是十进制数字字符串,可以写“*”或“*m$”(对于一些十进制整数m)来指定精度分别在下一个参数或第m个参数中给出,这必须是int 类型。 如果精度仅以“.”给出,或者精度为负,则精度为零。 这给出了 d、i、o、u、x 和 X 转换出现的最小位数, a、A、e、E、f 和 F 转换出现在基数字符之后的位数, g 和 G 转换的最大有效位数,或 s 和 S 转换从字符串中打印的最大字符数。 对于正值,这与为字段宽度和0标志提供相同值相同。 如果值为负数,则负号%05d宽度的一个字符。 printf("%.5d\n", -3); // use of precision filed printf("%05d\n", -3); // use of 0 flag to prepend with 0 输出: -00003 -0003

2022-05-17 03:24:19    分类:技术分享    c   printf

Is there a better way to size a buffer for printing integers?

问题 我想为sprintf整数创建一个缓冲区(在本例中为unsigned int )。 一个简单且被误导的方法是: char buf[11]; sprintf(buf, "%u", x); 如果我们知道unsigned int最多为33位宽,这很有效,但是如果我们想适应所有奇怪的架构怎么办? 我能想到的最好的是: char buf[(CHAR_BIT*sizeof(unsigned)+5)/3]; sprintf(buf, "%u", x); 我非常有信心这将适用于任何实施。 CHAR_BIT*sizeof(unsigned)是unsigned中的位数(上限)。 然后我加二除以 3 以找到八进制表示的位数,最后为 NUL 终止加一。 这意味着缓冲区足以以八进制打印数字,并且由于十进制表示使用的数字不超过八进制,因此对于十进制表示也足够了。 有一个更好的方法吗? 更好的意思是一种产生较小缓冲区的方法,而不会冒缓冲区溢出的风险,无论x具有什么值(即使面对恶意构造但符合标准的实现)。 我的方法将为 32 位unsigned生成一个 12 char缓冲区,尽管11就足够了。 回答1 编译不同的相关评论,最值得注意的是: 数学问题。 Martin R 的评论很好地总结了它: “n 个二进制数字需要 ceil(n*ln(2)/ln(10)) ≈ ceil(n * 0.301)” 你有你的答案:

2022-05-17 00:05:06    分类:技术分享    c   printf   buffer

C snprintf specify user home directory

问题 snprintf(filename, sizeof(filename), "%s_%s.sho", client, id); 回答1 用户控制他的环境 - 因此HOME环境变量可能不正确,甚至可能没有设置。 使用 getuid() 和 getpwuid() 获取系统指定的用户主目录: #include <unistd.h> #include <pwd.h> struct passwd *pwd = getpwuid( getuid() ); /* need to duplicate the string - we don't know what pw_dir points to */ const char *homeDir = strdup( pwd->pw_dir ); 错误检查留作练习...... 回答2 在 Linux 和 POSIX 系统上,主目录通常来自HOME环境变量。 所以你可能会编码 snprintf(filename, sizeof(filename), "%s/%s_%s.sho", getenv("HOME"), client, id); 迂腐地 getenv(3) 可能会失败(或错误)。 但这种情况很少发生。 请参见环境 (7)。 (您可以检查或使用 getpwuid(3) 和 getuid(2)...) 使用 setuid 可执行文件

2022-05-16 18:29:12    分类:技术分享    c   file   printf   home-directory

Matlab fprintf correct format specifier for rounding to 14 decimal places [closed]

问题 关闭。 这个问题是不可重现的,或者是由拼写错误引起的。 它目前不接受答案。 想改进这个问题? 更新问题,使其成为 Stack Overflow 的主题。 5年前关闭。 改进这个问题 我正在使用下面提供的代码来读取矩阵并在每个值的末尾应用分号 ( ; ) 和换行符。 我遇到了精度格式说明符的问题。 代码块下方是 csv 输出中的一行。 您可以看到第 5 列和第 6 列的格式正确,但有些指数值需要四舍五入到小数点后 14 位。 为什么第 4 行的 '%f.14' 不这样做? 我以为它没有使用指数符号? function write_to_csv(filepath, decision) csv = fopen('matrix.csv', 'a+'); for ii = 1:length(decision) format = '%d; %f.14'; fprintf(csv, format, decision(ii)); end fprintf(csv,'\n') fclose(csv); end 1个; 1.032204e-03; -2.580511e-04; 1个; 32190201170708; 17682101210450; 2; 7.600000e-01; -1; 感谢 MChandler 从问题中提供上述代码:Add a delimiter to end of each

2022-05-16 00:30:04    分类:技术分享    arrays   matlab   csv   for-loop   printf

Evaluation in return statement

问题 //prog1.c #include <stdio.h> int f(int *a,int *b,int c) { if(c == 0) return 1; else { *a = *a + 1; *b = *b - 1; c = c - 1; return (*a + f(a,b,c) + *b); } } int main() { int a = 3,b = 3,c = 3; printf("%d\n",f(&a,&b,c)); return 0; } 我使用gcc和clang-3.5执行了程序,发现 output = 16 。 我认为可能有一些特定于实现的行为,例如以下代码 //prog2.c #include <stdio.h> int f(int *x,int *y,int *z) { *x = *x + 1; *y = *y + 1; *z = *z + 1; return 0; } int main() { int a=0,b=0,c=0; printf("%d %d %d\n",a,f(&a,&b,&c),b);; return 0; } // gcc output : 1 0 0 // clang-3.5 : 0 0 1 在prog1.c中, return语句中是否有任何特定于实现的行为? 如果不是,它是如何评估的? 我可能不知道某种undefined

2022-05-15 21:46:46    分类:技术分享    c   function   pointers   return   printf

Assembly: printf not printing new line

问题 我有以下代码打印传递给./main的参数数量。 请注意rodata部分中的fmt 。 我已经包含了新行\n ,就像在C中一样,但不是打印新行,而是打印: 参数个数:1 \n 我的代码是: ;main.asm GLOBAL main EXTERN printf section .rodata: fmt db "Number of parameters: %d \n", 0 section .text: main: push ebp mov ebp, esp ;stackframe push dword[ebp+8] ;prepara los parametros para printf push fmt call printf add esp, 2*4 mov eax, 0 ;return value leave ;desarmado del stack frame ret 我知道在 0 之前和fmt中的“数字...”之后包含 10 会打印它,但我希望printf这样做。 我用NASM组装代码,然后通过GCC链接它来创建我的可执行文件。 回答1 当您在NASM中的字符串周围使用引号或双引号时,它不接受C样式的转义序列。 在 Linux 上,您可以将\n编码为 ASCII 10,如下所示: fmt db "Number of parameters: %d", 10, 0

2022-05-13 13:33:03    分类:技术分享    linux   assembly   x86   printf   nasm

How to get printf warnings in Visual Studio 2005?

问题 当向 printf() 提供错误数量的参数时: printf("%s", "foo", "bar"); 或者当提供错误类型的参数时: printf("%d", "foo"); gcc 能够警告这些错误: $ gcc -Wformat printf_too_many_arguments.c printf_warnings.c: In function `main': printf_warnings.c:5: warning: too many arguments for format printf_warnings.c:5: warning: too many arguments for format $ gcc -Wformat printf_argument_of_wrong_type.c printf_warnings.c: In function `main': printf_warnings.c:5: warning: format `%d' expects type `int', but argument 2 has type `char *' printf_warnings.c:5: warning: format `%d' expects type `int', but argument 2 has type `char *' 如何使用 Visual

2022-05-12 14:43:10    分类:技术分享    visual-studio-2005   warnings   printf

issue with assignment operator inside printf()

问题 这是代码 int main() { int x=15; printf("%d %d %d %d",x=1,x<20,x*1,x>10); return 0; } 输出为1 1 1 1 我期待1 1 15 1作为输出, x*1等于15但这里x*1是1 ,为什么? 在printf()中使用赋值运算符或修改值会导致undefined behaviour ? 回答1 您的代码会产生未定义的行为。 函数参数求值不是相对于彼此排序的。 这意味着在x=1中修改对x的访问与其他访问无关,例如x*1中的访问。 行为未定义。 再一次,它是未定义的,不是因为您“使用赋值运算符或修改 printf()中的值”,而是因为您对变量进行了修改访问,而该变量的访问与对同一变量的其他访问无关。 这段代码 (x = 1) + x * 1 出于同样的原因,也有未定义的行为,即使其中没​​有printf 。 同时,这段代码 int x, y; printf("%d %d", x = 1, y = 5); 很好,即使它“使用赋值运算符或修改 printf() 中的值”。 回答2 在函数调用中,函数参数可以按任何顺序计算。 由于其中一个参数修改x而其他参数访问它,因此结果未定义。 回答3 该标准规定; 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。 此外,只能访问先前值以确定要存储的值。

2022-05-11 14:13:05    分类:技术分享    c   gcc   printf   assignment-operator

How does systeminfo print lines?

问题 我正在使用以下代码在 Windows 7 上获取系统信息。 #include<stdio.h> int main() { FILE *p; p = popen("systeminfo", "r"); if(!p) { fprintf(stderr, "Error opening pipe.\n"); return 1; } while(!feof(p)) { printf("%c", fgetc(p)); } if (pclose(p) == -1) { fprintf(stderr," Error!\n"); return 1; } return 0; } 运行代码时,命令行会等待几秒钟以获取所需的信息。 第一行说: loading processor information... 然后将自身更新为: loading hotfix information... 这种情况发生了 5 或 6 次,然后实际输出被写入命令行窗口。 我想问一下,尽管代码说要按顺序打印所有字符,但第一行是如何自我更新的? printf("%c", fgetc(p)); 回答1 I did some experimentation, and it turns out that if standard output is redirected, systeminfo sends the status

2022-05-10 19:52:05    分类:技术分享    c   windows   cmd   printf