我正在使用一个用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()的方法,每种方法都有优点和缺点:
将对fprintf()的调用更改为sprintf()
尝试在字符串流中捕获a.print()的结果 …
我的程序写入日志和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函数.任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)?非常感谢.
这两个代码是否相同
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)代码,它通过一些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?
我有一个缓冲区,我通过串口接收.当我收到某个特征时,我知道已经到了一个完整的行,我想用printf方法打印它.但是每一行都有不同的长度值,当我刚开始时:
printf("%s", buffer);
Run Code Online (Sandbox Code Playgroud)
我正在打印该行以及属于前一行的其他字符(如果它比当前行长).
我在这里读到,至少在C++中,有可能告诉你想要阅读多少字符%s,但它没有例子,我不知道如何在C中做.任何帮助?
编辑:完美.所以我有三个解决方案: - for使用循环字符 - 使用终止字符 - 或使用.*打印字符串char .
问题是:哪一个更快?因为我正在研究微芯片PIC,我希望它尽可能快地发生
假设我有一个#!/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) 在C中,printf()语句允许在参数列表中提供精度长度.
printf("%*.*f", 7, 3, floatValue);
Run Code Online (Sandbox Code Playgroud)
其中星号分别用第一和第二值替换.
我正在寻找Android/Java中的等价物; String.format()抛出异常.
编辑:谢谢,@ Tenner; 它确实有效.
我想实现文本绘图功能.但我不确定\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
有谁知道标准算法?提前致谢.
大家好我想用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) 我正在研究一种速度至关重要的嵌入式DSP,而且内存很短.
目前,sprintf使用我代码中任何函数的大部分资源.我只用它来格式化一些简单的文本:%d, %e, %f, %s没有精确或奇异的操作.
如何实现更适合我的使用的基本sprintf或printf函数?