标签: printf

sprintf 何时以及为什么会失败?

我正在使用 swprintf 将字符串构建到缓冲区中(使用循环等)。

const int MaxStringLengthPerCharacter = 10 + 1;
wchar_t* pTmp = pBuffer;
for ( size_t i = 0; i < nNumPlayers ; ++i)
{
    const int nPlayerId = GetPlayer(i);
    const int nWritten = swprintf(pTmp, MaxStringLengthPerCharacter, TEXT("%d,"), nPlayerId);
    assert(nWritten >= 0 );
    pTmp += nWritten;
}

*pTaskPlayers = '\0';
Run Code Online (Sandbox Code Playgroud)

如果在测试期间断言从未命中,我可以确定它永远不会在实时代码中命中吗?也就是说,我是否需要检查 nWritten < 0 并处理它,还是我可以安全地假设不会有问题?

什么情况下可以返回-1?文档或多或少只是说明“如果功能失败”。在一个地方,我读到如果它不能匹配参数(即格式化字符串与可变参数),它将失败,但这并不让我担心。

在这种情况下,我也不担心缓冲区溢出 - 我知道缓冲区足够大。

c c++ printf widestring

6
推荐指数
1
解决办法
4876
查看次数

使用 snprintf 打印数组?备择方案?

是否可以使用 snprintf用来打印数组?我知道它可以接受多个参数,并且它期望至少与您的格式化字符串所建议的一样多,但是如果我只给它 1 个格式化字符串和一个值数组,它会将整个数组打印到缓冲区吗?

我问的原因是因为我正在修改源代码,而当前的实现只支持将一个值放在一个字符串中,但我正在修改它以支持一组值。我想尽可能少地更改原始实现。

如果这不起作用,有人会推荐另一种方法吗?我应该把它搞定并使用 for 循环(如果没有 stringbuffers,它真的能工作得有多好)?

本质上:将双精度数组中的所有值放入同一个字符串以进行返回的最佳方法是什么?

c printf

6
推荐指数
2
解决办法
2939
查看次数

Golang:如何打印结构中的字节的 % x ?

var b [88]byte
n, err := file.Read(b[:])
fmt.Printf("bytes read: %d Bytes: [% x]\n", n, b)
Run Code Online (Sandbox Code Playgroud)

上面以十六进制打印字节

我有一个这样的结构

type SomeStruct struct {
   field1 []byte
   field2 []byte
}
someStructInstance := SomeStruct{[249 190 180 217], [29 1 0 0]}
fmt.Println(someStructInstance)
=> {[249 190 180 217] [29 1 0 0]}
Run Code Online (Sandbox Code Playgroud)

但理想情况下我希望它打印十六进制

=> {[f9 be b4 d9] [1d 01 00 00]}
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

printf byte go

6
推荐指数
2
解决办法
2万
查看次数

更改 sprintf() 中的小数字符

我可以使用以下命令更改输出中的小数字符:

> 1/2
[1] 0.5
> options(OutDec = ',')
> 1/2
[1] 0,5
Run Code Online (Sandbox Code Playgroud)

但是,这种变化并不影响sprintf()功能。

> sprintf('%.1f', 1/2)
[1] "0.5"
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:有一种简单的方法可以改变它(小数字符)吗?我认为我不能使用“简单”RE,因为并非所有.需要都通过 进行交易,。

我不知道该怎么做,所以我不能说我已经做了什么。

printf r

6
推荐指数
1
解决办法
1649
查看次数

如何使用 open() 和 printf() 写入文件?

我正在使用 open() 打开一个文件,并且需要使用 printf 打印到该文件,而不输出到控制台。我该怎么做呢?我可以成功创建文件,并 printf 到控制台,但这是不正确的。

int main(int argc, char *argv[]) {
    int fd;
    char *name = "helloworld";
    fd = open(name, O_CREAT);

    char *hi = "Hello World";
    printf("%s\n", hi);

    close(fd);
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

我需要程序没有输出到控制台,但是如果我查看该文件helloworld,它应该在里面写有“Hello World”。例如:

prompt> ./hello
prompt> more helloworld
   Hello World
Run Code Online (Sandbox Code Playgroud)

c file-io printf output

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

如何在 csh 脚本中分配变量并将它们用作同一脚本的参数?

再会,

希望这里得到任何人的帮助,提前致谢。我有 T.csh ,如下所示:

#! /bin/csh

set a="01 02 03 04 05 06 07 08 09 10 11 12 13"
set b="14 15 16 17 18 19 20 21 22 23 24 25"
set c="01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"

set X = `grep $1 EOL.txt | head -n1 | cut -d- -f1`
printf "$X\n$2\n$3\nYYYY\n1\nN\n"
Run Code Online (Sandbox Code Playgroud)

变量 a、b 和 c 可以选择用作 printf …

unix printf csh set echo

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

打印到终端会导致 OOM(内存不足)吗?

  1. 打印到终端如何影响内存使用?它会一直消耗内存直到 OOM 吗?
  2. 那么在 docker 容器中呢?
  3. 操作系统如何处理打印到终端的内存?
  4. 操作系统是否会在某个时刻刷新终端?

terminal printf

6
推荐指数
1
解决办法
918
查看次数

C 从 FILE* 打印文件路径

FILE * fd = fopen ("/tmp/12345","wb");
Run Code Online (Sandbox Code Playgroud)

如果我有变量fd,我如何打印文件路径?(/tmp/12345) 在 Linux 环境中。

c linux printf fopen file

6
推荐指数
3
解决办法
1281
查看次数

如何解决“格式中未知的转换类型字符‘z’”编译器特定的警告?

我正在处理交叉编译到多个目标架构的代码。

我看着少数 的 点击来自搜索堆栈溢出的的“printf的size_t未知的转换型性格”的警告,但这些职位似乎都涉及到minGW,所以这些问题的答案,基本上是ifdef荷兰国际集团对抗_WIN32,并不适用于我的基本上是相同的实例问题,即printf不识别“ %zu”作为 的格式说明符size_t,但使用mips交叉编译器。

是否有一个现有的编译器标志(针对上述交叉编译器)使 libc 能够将“%zu”识别为 的格式说明符size_t?

$ cat ./main.c
// main.c

#include <stdio.h>

int main( int argc, char* argv[] )
{
  size_t i = 42;
  printf( "%zu\n", i );
  return 0;
}

$ /path/to/mips_fp_le-gcc --version
2.95.3
$ 
$ file /path/to/libc.so.6
/path/to/libc.so.6: ELF 32-bit LSB pie executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.2.15, not …
Run Code Online (Sandbox Code Playgroud)

c printf mips cross-compiling format-specifiers

6
推荐指数
1
解决办法
1539
查看次数

为什么在使用 wprintf 时将 ©(版权符号)替换为 (C)?

当我尝试©用printf或打印版权符号时write,它工作得很好:

#include <stdio.h>

int main(void)
{
    printf("©\n");
}
Run Code Online (Sandbox Code Playgroud)

#include <unistd.h>

int main(void)
{
    write(1, "©\n", 3);
}
Run Code Online (Sandbox Code Playgroud)

输出:

©
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用 打印它时wprintf,我得到(C):

#include <stdio.h>
#include <wchar.h>

int main(void)
{
    wprintf(L"©\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:

(C)
Run Code Online (Sandbox Code Playgroud)

但是,当我添加对 的调用时它已修复setlocale:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    setlocale(LC_ALL, "");
    wprintf(L"©\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:

©
Run Code Online (Sandbox Code Playgroud)

为什么存在原始行为,为什么在我调用时它被修复了setlocale?此外,这种转换发生在哪里?我怎样才能setlocale在默认之后做出行为?

编译命令:

gcc test.c
Run Code Online (Sandbox Code Playgroud)

locale:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8" …
Run Code Online (Sandbox Code Playgroud)

c printf widechar

6
推荐指数
1
解决办法
174
查看次数

标签 统计

printf ×10

c ×6

byte ×1

c++ ×1

cross-compiling ×1

csh ×1

echo ×1

file ×1

file-io ×1

fopen ×1

format-specifiers ×1

go ×1

linux ×1

mips ×1

output ×1

r ×1

set ×1

terminal ×1

unix ×1

widechar ×1

widestring ×1