我有一些c(++)代码使用sprintf将uint_64转换为字符串.这需要可移植到Linux和Solaris.
在linux上我们使用%ju,但在Solaris上似乎没有任何等价物.我能找到的最接近的是%lu,但这会产生不正确的输出.一些示例代码:
#include <stdio.h>
#include <sys/types.h>
#ifdef SunOS
typedef uint64_t u_int64_t;
#endif
int main(int argc, char **argv) {
u_int64_t val = 123456789123L;
#ifdef SunOS
printf("%lu\n", val);
#else
printf("%ju\n", val);
#endif
}
Run Code Online (Sandbox Code Playgroud)
在linux上,输出是预期的; 在Solaris 9上(不要问),它是"28"
我可以用什么?
我C编码的一个程序,用printf将消息发送到标准输出和我无法将输出重定向到一个文件(从bash中运行).
我试过了:
./program argument >> program.out
./program argument > program.out
./program >> program.out argument
./program > program.out argument
Run Code Online (Sandbox Code Playgroud)
在每种情况下,都会创建文件program.out但它仍然为空.执行结束后,文件大小为0.
如果我在执行程序时省略重定向:
./program argument
Run Code Online (Sandbox Code Playgroud)
然后,使用printf发送到stdout的所有消息都显示在终端中.
我有其他C程序,我没有问题以这种方式重定向输出.它与程序本身有关吗?与论点传递?应该在哪里寻找问题?
关于C程序的一些细节:
一些代码:
int main(int argc, char** argv)
{
printf("Execution started\n");
do
{
/* lots of printf here */
} while (1);
/* Code never reached */
pthread_exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码舍入到2dp:
sprintf(temp,"%.2f",coef[i]); //coef[i] returns a double
Run Code Online (Sandbox Code Playgroud)
它成功地将6.666舍入到6.67,但在舍入5.555时它无法正常工作.它返回5.55,而它应该(至少在我看来)返回5.56.
当下一个数字是5时,我怎样才能将它弄圆?即返回5.56.
编辑:我现在意识到这种情况正在发生,因为当我用cin输入5.555时它会被保存为5.554999997.
我将尝试分两个阶段 - 首先是3dp然后是2dp.还有其他(更优雅)的想法吗?
这是什么%.6d意思的:
printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);
Run Code Online (Sandbox Code Playgroud)
这是一个错字吗?
它似乎%.6d是一样的%6d.
GCC编译器如何解释以下行:
printf("HELLO");
Run Code Online (Sandbox Code Playgroud)
我想知道这个,因为当我运行以下程序时:
main()
{
printf(5+"Good Morning");
}
Run Code Online (Sandbox Code Playgroud)
该程序正在打印:
Morning
Run Code Online (Sandbox Code Playgroud)
为什么编译器从第六个字符开始打印?
我正在尝试创建一个框架来处理文件和数据.我正在努力解决的一个领域是如何为框架提供日志记录功能,允许框架在不知道正在使用的日志记录的情况下报告消息.
let testLogger (source:seq<'a>) logger =
logger "Testing..."
let length = source |> Seq.length
logger "Got a length of %d" length
let logger format = Printf.kprintf (printfn "%A: %s" System.DateTime.Now) format
testLogger [1; 2; 3] logger
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望此代码可以工作,但我无法确定如何传递记录器功能.
我有一个PHP脚本,显示时间像:9.08374786377E-5,但我需要简单的浮动值作为时间像:0.00009083747 .....这就是为什么我只是用它浮动打印它:
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$time_end = microtime_float();
$time = $time_end - $time_start;
printf('%.16f', $time);
?>
Run Code Online (Sandbox Code Playgroud)
它很好地显示了结果,但我需要在新变量中设置此打印值.我怎样才能做到这一点 ?我需要在新变量$ var中设置此打印值;
$var = printf('%.16f', $time);
Run Code Online (Sandbox Code Playgroud)
//我们都知道它不起作用,但如何设定?
的printf和scanf的函数用C家庭消耗对应于所述基本数据类型原始格式说明了一把- %d对int,%llu对unsigned long long int等
但是,有许多标准类型的别名,人们希望在实践中使用,例如int32fast_t,一个人不能也不应该知道底层的基本类型.对于别名stdint.h,C标准谢天谢地指定了一组宏来生成相应的格式字符串,例如PRI32in inttypes.h.
Posix有一组类似的宏吗?POSIX拥有吨不透明的类型,如ssize_t,pid_t,rlim_t,suseconds_t,等等,这些都对基本intgral类型的所有变化.如何在格式字符串中可移植地使用这些类型?
假设我有一个这样的文件:
$ cat a
hello this is a sentence
and this is another one
Run Code Online (Sandbox Code Playgroud)
我想打印前两列,在它们之间有一些填充.由于这个填充可能会改变,我可以使用例如7:
$ awk '{printf "%7-s%s\n", $1, $2}' a
hello this
and this
Run Code Online (Sandbox Code Playgroud)
或者17:
$ awk '{printf "%17-s%s\n", $1, $2}' a
hello this
and this
Run Code Online (Sandbox Code Playgroud)
或者25,或......你明白了这一点:数字可能会有所不同.
然后弹出一个问题:是否可以为此分配变量N,而不是以%N-s格式对整数进行硬编码?
我尝试了这些事情没有成功:
$ awk '{n=7; printf "%{n}-s%s\n", $1, $2}' a
%{n}-shello
%{n}-sand
$ awk '{n=7; printf "%n-s%s\n", $1, $2}' a
%n-shello
%n-sand
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想知道是否可以这样做.如果不是,那么最好的解决方法是什么?
该printf系列函数提供一系列长度改性剂,其中的两个是hh(表示一个signed char或unsigned char参数升为int)和h(表示一个signed short或unsigned short参数升为int).从历史上看,这些长度修饰符仅用于创建长度修饰符的对称性,scanf很少用于printf.
以下是ISO 9899:2011§7.21.6.1"fprintf函数"7的摘录:
7长度修饰符及其含义是:
hh用于指定后续的d,i,o,u,x,或X转换说明适用于一个signed char或unsigned char参数(该参数将被提升根据整数促销,但它的值应被转换成signed char或unsigned char之前印刷); 或者以下n转换说明符适用于指向signed char参数的指针.
h用于指定后续的d,i,o,u,x,或X转换说明适用于一个short int或unsigned short int …