我希望 printf 在计算字段宽度时识别多字节字符,以便列正确排列...我找不到这个问题的答案,想知道这里是否有人有任何建议,或者可能是函数/脚本可以解决这个问题。
\n\n这是一个快速而肮脏的例子:
\n\n\nprintf "## %5s %5s %5s ##\\n## %5s %5s %5s ##\\n" \'\' \'*\' \'\' \'\' "\xe2\x80\xa2" \'\'\n>## * ##\n>## \xe2\x80\xa2 ##\n
显然,我想要的结果是:
\n\n\n>## * ##\n>## \xe2\x80\xa2 ##\n
有什么办法可以实现这个目标吗?
\nformat not a string literal and no format arguments当我在 Linux 上编译它时,我收到警告。snprintf显示const char*第三个参数。const char *INTERFACE = "wlan0"定义然后将其传递给函数有什么问题 ?
#include <stdio.h>
#include <net/if.h>
#include <string.h>
int main(int argc,char *argv[]){
const char *INTERFACE = "wlan0";
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), INTERFACE);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我以为我在这里做了一些简单的事情,但 C 决定对我进行异步处理。我不确定发生了什么事。这是我的代码:
#include <stdio.h>
int main() {
printf("start");
sleep(5);
printf("stop");
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行时,我发现它sleep(5)就像一个魅力。但编译器认为跳过第一个printf()并出现乱序是个好主意,因此在运行时,程序会等待 5 秒,然后打印startstop。
这是怎么回事?我的理论是,程序使用 shell 启动打印操作,然后继续执行该程序,让 Bash 等待,直到程序不再忙于实际呈现字符串。但我真的不知道。
谢谢
我有一个代码库,旨在在没有警告的情况下进行编译,并在多种架构上运行而不会出现任何故障,所有 x86:MSDOS、Windows 32 控制台模式、Windows 32 GUI 模式、Linux 32 和 Linux 64。
\n\n在添加对 Linux 64 的支持之前,这很容易。几乎所有数据都被声明为intBYTE、WORD 和 DWORD 的类型定义:
typedef unsigned char BYTE;\ntypedef unsigned short WORD;\ntypedef unsigned long DWORD;\nRun Code Online (Sandbox Code Playgroud)\n\n添加 64 位 gcc 支持后,DWORD 需要进行一些调整才能保持 32 位值,因为它表示存储的数据:
\n\n// to compile DWORDs as 32 bits on 64-bit machines:\n#if __x86_64__\n typedef unsigned int DWORD;\n#else\n typedef unsigned long DWORD;\n#endif\nRun Code Online (Sandbox Code Playgroud)\n\n这在所有环境下都运行良好:
\n\nDWORD data;\nprintf ("%lu", data);\nRun Code Online (Sandbox Code Playgroud)\n\n但是,gcc -Wall现在抱怨格式转换:
warning: format \xe2\x80\x98%ld\xe2\x80\x99 expects argument of …Run Code Online (Sandbox Code Playgroud) 我很困惑这些数字的含义。对我来说, printf 似乎给了我错误的结果。
echo printf("%.2f", 1);
// 1.004
echo printf("%.3f", 1);
// 1.005
echo printf("%.2f", 1.1234);
// 1.124
Run Code Online (Sandbox Code Playgroud)
首先,它似乎打印了太多小数,我不知道这些数字是什么。有人可以解释一下这个问题吗?
我复制了一些使用 printf 输出字符串在文件中出现的频率的代码。
awk ' BEGIN { print "The number of times a appears in the file:" ; }
/a/ { a_counter+=1 ; }
END { printf "%s\n", a_counter ; }
' $file
Run Code Online (Sandbox Code Playgroud)
将模式修改为变量后,我想将该模式包含到 printf 命令中,位于计数旁边:
awk -v a="$GENE1" ' BEGIN { print "The number of times", a, " appears in the file are:" ; }
$0 ~ a { a_counter+=1 ; }
END { printf "%s\n", a, a_counter ; }
' $file
Run Code Online (Sandbox Code Playgroud)
现在它只打印a的值,而不打印a_counter的值。我读到这printf更复杂,我可能不应该添加用“,”分隔的多个字符串,就像我可以用print. 但我找不到正确的方法?我当然可以坚持下去print …
我正在努力使用 GCC 将 printf 从 newlib 正确实现到我的 esp32 中。
我已经阅读了 newlib 文档,它为我提供了有关如何调用 printf 的一般信息,但没有向我解释后端实现。
根据我当前的研究,我确定 printf 将格式化字符串输出到 STDOUT。在 PC 上,这对我来说更容易理解,因为有一个控制台窗口可以显示 printf 的格式化输出,但是在嵌入式系统上,我知道您必须告诉库将 printf 的格式化输出重定向到哪里,这就是我正在想办法。
再次,根据我的研究,我了解到需要一些功能来完成此任务,特别是功能_write。
我发现如何弥合 printf 和使用该_write函数之间的差距非常困难。我希望这里有人能帮助我理解如何正确实现 printf。
如果我错过了一些清楚解释这一点的文档,那么请将我重定向到该文档。我尝试阅读 newlib 文档以及 GCC 相关文档,但没有真正提到如何使用 printf,但是有大量关于如何调用 printf 和格式化字符串的文档,但这部分很简单。我需要知道如何从 MCU 的 STDOUT 获取格式化字符串。
谢谢大家!
我正在研究C如何通过位模式在内存中存储数据。
然而,在格式化方面我遇到了一些问题printf。
我已将一个变量保存为-10(我确实理解二进制补码),将另一个变量保存为246. 这两个变量的位模式为11110110(即0xF6)。
我试图使用unsigned int十六进制格式打印出一个值printf。
char a = -10;
unsigned char b = 246;
printf("a : %x , b : %x\n" , (unsigned int) a, (unsigned int) b);
//a : fffffff6 , b : f6
Run Code Online (Sandbox Code Playgroud)
两个整数具有相同的位模式0xF6。但是,如果我执行类型转换到unsigned int,结果会有所不同。结果0xFFFFFFF6为a,而b保持不变。
对于有符号字符,在我看来,类型转换过程将 变为unsigned char整数,并用 1 填充所有空位。
这是因为他们的签名吗?或者这只是未定义的行为?
我想知道具体printf("%d",x)是如何解释的。我只知道编译器保留一个内存来放置'%', '%d','\0'并将其地址返回到,然后根据我们指定的格式说明符printf打印第二个参数。x
那么,如果我使用 example int x=5; char *p="%d"; printf(p,x),它与 是一样的吗printf("%d",x)?
上下文:我正在使用 Awesome package 创建 .docx 表flextable。该包具有在最终输出中格式化数字的功能:set_formatter_type()。如果我理解正确的话,这个函数需要一个可以被使用的字符输入sprintf()。我能够使用以下命令实现预期的输出set_formatter(),但需要明确命名每一列,而我无法对真实的表执行此操作。
问题:我无法找到如何使用sprintf()与flextable::set_formatter_type().
可以使用以下命令实现正确的格式设置formatC(),但此功能不适用于flextable::set_formatter_type()
formatC(x = signif(1715235456.5684, 3), big.mark = " ", digits = 0, format = "f")
[1] "1 720 000 000"
Run Code Online (Sandbox Code Playgroud)
使用sprintf()我能够实现:
sprintf("%.0f", signif(1715235456.5684, 3))
[1] "1720000000"
Run Code Online (Sandbox Code Playgroud)
可重现的例子:
df <- flextable::flextable(iris[1:3]*1000)
flextable::set_formatter_type(df, fmt_double = "%.0f") # works fine but I can't get big mark separator
flextable::set_formatter_type(df, fmt_double = function(x) formatC(x, digits = 0, big.mark = …Run Code Online (Sandbox Code Playgroud)