标签: printf

C++:如何将fprintf结果作为std :: string w/o sprintf

我正在使用一个用C++实现的开源UNIX工具,我需要更改一些代码才能让它做我想做的事情.我想做出尽可能小的改变,希望上传接受我的补丁.可以在标准C++中实现并且不创建更多外部依赖性的解决方案是首选.

这是我的问题.我有一个C++类 - 我们称之为"A" - 目前使用fprintf()将其格式严格的数据结构打印到文件指针.在其print函数中,它还递归调用几个成员类的相同定义的打印函数("B"是一个例子).还有另一个C类,它有一个成员std :: string"foo",需要设置为A实例的print()结果.把它想象成A的to_str()成员函数.

在伪代码中:

class A {
public:
  ...

  void print(FILE* f);
  B b;

  ...  
};

...

void A::print(FILE *f)
{
  std::string s = "stuff";
  fprintf(f, "some %s", s);
  b.print(f);
}

class C {
  ...
  std::string foo;
  bool set_foo(std::str);
  ...
}

...

A a = new A();
C c = new C();

...

// wish i knew how to write A's to_str()
c.set_foo(a.to_str());
Run Code Online (Sandbox Code Playgroud)

我应该提到C是相当稳定的,但是A和B(以及A的其余部分)处于不稳定的状态,因此所需的代码变化越少越好.还需要保留当前的打印(FILE*F)界面.我已经考虑了几种实现A :: to_str()的方法,每种方法都有优点和缺点:

  1. 将对fprintf()的调用更改为sprintf()

    • 我不必重写任何格式字符串
    • print()可以重新实现为:fprint(f,this.to_str());
    • 但是我需要手动分配char [] s,合并很多c字符串,最后将字符数组转换为std :: string
  2. 尝试在字符串流中捕获a.print()的结果 …

c++ unix format printf stdstring

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

包装器printf函数根据用户首选项进行过滤

我的程序写入日志和stdout.但是,每条消息都有一定的优先级,用户在Preferences中指定哪个优先级转到哪个流(log或stdout).

unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;
Run Code Online (Sandbox Code Playgroud)

首选项由一些标志处理:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL);
unsigned short PRIO_STD = (PRIO_HIGH);
Run Code Online (Sandbox Code Playgroud)

write_log函数应使用与printf函数相同的参数,并添加参数unsigned short priority.

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1);
Run Code Online (Sandbox Code Playgroud)

(即使PRIO_NORMAL|PRIO_LOW没什么意义......)

检查标志很简单:( if(priority & PRIO_LOG)如果在两个参数中都设置了任何标志,则返回> 1)

但是,我不知道如何将字符串文字格式参数传递给printf函数.任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)?非常感谢.

c printf filter wrapper

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

用printf打印字符

这两个代码是否相同

char ch = 'a';
printf("%d", ch);
Run Code Online (Sandbox Code Playgroud)

它会打印垃圾值吗?

我很困惑

printf("%d", '\0'); 
Run Code Online (Sandbox Code Playgroud)

这会打印0还是垃圾值?因为我这样做的时候

printf("%d", sizeof('\n')); 
Run Code Online (Sandbox Code Playgroud)

它打印4.为什么是sizeof('\n')4个字节?C++中的相同内容打印1个字节.这是为什么?

所以这是主要问题

在c语言中printf("%d", '\0')应该打印0

在C++中printf("%d", '\0')应该打印垃圾?

c c++ printf sizeof

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

什么浮点值使sprintf_s()产生"1.#QO"?

我有一些(遗留嵌入式c)代码,它通过一些sprintf调用生成.csv文件.偶尔我会看到的价值观1.#QO.我尝试过复制这些值的条件应该给出负无穷大,正无穷大和NaN,但它们似乎都没有给我神奇的1.#QO结果.那么产生这种价值的是什么呢?

......是的,我知道数学中出现了明显的问题,产生了这个价值,但理解它的意义将有助于调试工作.

[编辑1]进行转换的实际行是:

sprintf_s(txt, CSV_HEADER_SIZE, "%.3f", value);
Run Code Online (Sandbox Code Playgroud)

哪里:

#define CSV_HEADER_SIZE (100)
char txt[CSV_HEADER_SIZE];
Run Code Online (Sandbox Code Playgroud)

我正在使用MS Visual Studio 2008进行编译.

[编辑2]更多挖掘节目0xFFFFFFFF给出-1.#QO:

unsigned int i = 0xFFFFFFFF;
float* f = (float*)&i;
printf("%.3f", *f); // gives -1.#QO
Run Code Online (Sandbox Code Playgroud)

..并在Visual Studio调试器中-1.#QNAN00查看它将其扩展为所以看起来这可能是Microsoft特定的表示形式NaN

c format floating-point printf visual-studio-2008

18
推荐指数
1
解决办法
6359
查看次数

打印一个char的缓冲区,在C中传递长度

我有一个缓冲区,我通过串口接收.当我收到某个特征时,我知道已经到了一个完整的行,我想用printf方法打印它.但是每一行都有不同的长度值,当我刚开始时:

printf("%s", buffer);
Run Code Online (Sandbox Code Playgroud)

我正在打印该行以及属于前一行的其他字符(如果它比当前行长).

在这里读到,至少在C++中,有可能告诉你想要阅读多少字符%s,但它没有例子,我不知道如何在C中做.任何帮助?

编辑:完美.所以我有三个解决方案: - for使用循环字符 - 使用终止字符 - 或使用.*打印字符串char .

问题是:哪一个更快?因为我正在研究微芯片PIC,我希望它尽可能快地发生

c printf buffer

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

POSIX sh相当于Bash的printf%q

假设我有一个#!/bin/sh可以采用各种位置参数的脚本,其中一些可能包含空格,两种引号或两种引号等.我想迭代"$@"并为每个参数立即以某种方式处理它,或者保存以供以后使用.在脚本结束时,我想启动(可能exec)另一个进程,传递一些这些参数,所有特殊字符都保持不变.

如果我没有对参数进行处理,othercmd "$@"那么工作正常,但我需要提取一些参数并稍微处理它们.

如果我可以假设Bash,那么我可以printf %q用来计算我eval以后可以引用的args的引用版本,但这不适用于例如Ubuntu的Dash(/bin/sh).

是否printf %q可以使用内置函数和POSIX定义的实用程序在简单的Bourne shell脚本中编写任何等效文件,比如说我可以复制到脚本中的函数?

例如,脚本以ls相反的顺序尝试其参数:

#!/bin/sh
args=
for arg in "$@"
do
    args="'$arg' $args"
done
eval "ls $args"
Run Code Online (Sandbox Code Playgroud)

适用于许多情况:

$ ./handle goodbye "cruel world"
ls: cannot access cruel world: No such file or directory
ls: cannot access goodbye: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但不是在'使用时:

$ ./handle goodbye "cruel'st world"
./handle: 1: eval: Syntax error: Unterminated quoted …
Run Code Online (Sandbox Code Playgroud)

bash quotes printf posix sh

18
推荐指数
2
解决办法
3094
查看次数

java等效于printf("%*.*f")

在C中,printf()语句允许在参数列表中提供精度长度.

printf("%*.*f", 7, 3, floatValue);
Run Code Online (Sandbox Code Playgroud)

其中星号分别用第一和第二值替换.

我正在寻找Android/Java中的等价物; String.format()抛出异常.

编辑:谢谢,@ Tenner; 它确实有效.

java string.format printf android

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

制表符(\ t)有多少个空格?

我想实现文本绘图功能.但我不确定\t它是如何工作的,这意味着我不知道应该打印多少个空格\t.

我想出了以下算法:

a)每个\t代表最多NUMBER_OF_SPACES_FOR_TAB空间.b)如果\t出现在相应位置的最后一行,则\t该行应与\t最后一行对齐.

例:

printf("a\t\tb\n");
printf("\t\tc\n");
Run Code Online (Sandbox Code Playgroud)

应打印:

a11112222b
34444c
Run Code Online (Sandbox Code Playgroud)

哪里:

1.Number i表示\t位置的空格i

2.NUMBER_OF_SPACES_FOR_TAB == 4

有谁知道标准算法?提前致谢.

c c++ printf

18
推荐指数
3
解决办法
8万
查看次数

在C中打印void*变量

大家好我想用printf进行调试.但我不知道如何打印"out"变量.

在返回之前,我想打印此值,但其类型为void*.

int 
hexstr2raw(char *in, void *out) {
    char c;
    uint32_t i = 0;
    uint8_t *b = (uint8_t*) out;
    while ((c = in[i]) != '\0') {
        uint8_t v;
        if (c >= '0' && c <= '9') {
            v = c - '0';
        } else if (c >= 'A' && c <= 'F') {
            v = 10 + c - 'A';
        } else if (c >= 'a' || c <= 'f') {
            v = 10 + c - 'a';
        } else …
Run Code Online (Sandbox Code Playgroud)

c printf void-pointers uint

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

sprintf或printf的最小实现

我正在研究一种速度至关重要的嵌入式DSP,而且内存很短.

目前,sprintf使用我代码中任何函数的大部分资源.我只用它来格式化一些简单的文本:%d, %e, %f, %s没有精确或奇异的操作.

如何实现更适合我的使用的基本sprintf或printf函数?

c embedded printf

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