标签: printf

printf 字段宽度不支持多字节字符?

我希望 printf 在计算字段宽度时识别多字节字符,以便列正确排列...我找不到这个问题的答案,想知道这里是否有人有任何建议,或者可能是函数/脚本可以解决这个问题。

\n\n

这是一个快速而肮脏的例子:

\n printf "## %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

\n\n

有什么办法可以实现这个目标吗?

\n

bash shell printf sh

4
推荐指数
1
解决办法
2318
查看次数

snprintf - 格式不是字符串文字且没有格式参数警告

format 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 linux printf gcc posix

4
推荐指数
1
解决办法
9888
查看次数

为什么 printf() 后面的行(对 sleep() 的调用)在打印任何内容之前执行?

我以为我在这里做了一些简单的事情,但 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 等待,直到程序不再忙于实际呈现字符串。但我真的不知道。

谢谢

c printf sleep

4
推荐指数
1
解决办法
1717
查看次数

%ld 格式转换以实现可移植性

我有一个代码库,旨在在没有警告的情况下进行编译,并在多种架构上运行而不会出现任何故障,所有 x86:MSDOS、Windows 32 控制台模式、Windows 32 GUI 模式、Linux 32 和 Linux 64。

\n\n

在添加对 Linux 64 的支持之前,这很容易。几乎所有数据都被声明为intBYTE、WORD 和 DWORD 的类型定义:

\n\n
typedef unsigned char   BYTE;\ntypedef unsigned short  WORD;\ntypedef unsigned long   DWORD;\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在所有环境下都运行良好:

\n\n
DWORD   data;\nprintf ("%lu", data);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,gcc -Wall现在抱怨格式转换:

\n\n
warning: format \xe2\x80\x98%ld\xe2\x80\x99 expects argument of …
Run Code Online (Sandbox Code Playgroud)

c++ x86 printf 16-bit 32bit-64bit

4
推荐指数
1
解决办法
1万
查看次数

PHP printf 函数及其奇怪的行为

我很困惑这些数字的含义。对我来说, 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)

首先,它似乎打印了太多小数,我不知道这些数字是什么。有人可以解释一下这个问题吗?

php printf integer

4
推荐指数
1
解决办法
416
查看次数

awk 的 printf 插入多个变量的正确语法是什么?

我复制了一些使用 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 …

bash awk printf

4
推荐指数
1
解决办法
547
查看次数

如何从 Newlib 在 GCC 中实现 printf?

我正在努力使用 GCC 将 printf 从 newlib 正确实现到我的 esp32 中。

我已经阅读了 newlib 文档,它为我提供了有关如何调用 printf 的一般信息,但没有向我解释后端实现。

根据我当前的研究,我确定 printf 将格式化字符串输出到 STDOUT。在 PC 上,这对我来说更容易理解,因为有一个控制台窗口可以显示 printf 的格式化输出,但是在嵌入式系统上,我知道您必须告诉库将 printf 的格式化输出重定向到哪里,这就是我正在想办法。

再次,根据我的研究,我了解到需要一些功能来完成此任务,特别是功能_write。

我发现如何弥合 printf 和使用该_write函数之间的差距非常困难。我希望这里有人能帮助我理解如何正确实现 printf。

如果我错过了一些清楚解释这一点的文档,那么请将我重定向到该文档。我尝试阅读 newlib 文档以及 GCC 相关文档,但没有真正提到如何使用 printf,但是有大量关于如何调用 printf 和格式化字符串的文档,但这部分很简单。我需要知道如何从 MCU 的 STDOUT 获取格式化字符串。

谢谢大家!

c embedded printf gcc newlib

4
推荐指数
1
解决办法
5443
查看次数

为什么数字在转换为无符号类型时会进行符号扩展?

我正在研究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 填充所有空位。

这是因为他们的签名吗?或者这只是未定义的行为?

c printf

4
推荐指数
1
解决办法
1626
查看次数

printf("%d",x) 如何工作/解释?

我想知道具体printf("%d",x)是如何解释的。我只知道编译器保留一个内存来放置'%', '%d','\0'并将其地址返回到,然后根据我们指定的格式说明符printf打印第二个参数。x

那么,如果我使用 example int x=5; char *p="%d"; printf(p,x),它与 是一样的吗printf("%d",x)?

c c++ printf

4
推荐指数
1
解决办法
1470
查看次数

如何在不使用列名的情况下在flextable对象中指定大标记分隔符?

上下文:我正在使用 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)

printf r flextable

4
推荐指数
1
解决办法
1534
查看次数

标签 统计

printf ×10

c ×5

bash ×2

c++ ×2

gcc ×2

16-bit ×1

32bit-64bit ×1

awk ×1

embedded ×1

flextable ×1

integer ×1

linux ×1

newlib ×1

php ×1

posix ×1

r ×1

sh ×1

shell ×1

sleep ×1

x86 ×1