标签: printf

Solaris 9上的printf + uint_64?

我有一些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 c++ printf

9
推荐指数
2
解决办法
4429
查看次数

在bash中重定向C程序输出时出现问题

我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程序的一些细节:

  • 它没有从stdin中读取任何内容
  • 它使用BSD Internet Domain套接字
  • 它使用POSIX线程
  • 它使用sigaction为SIGINT信号分配一个特殊的处理函数
  • 它向stdout发送了许多换行符(对于那些认为我应该刷新的人)

一些代码:

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)

c linux bash printf redirect

9
推荐指数
2
解决办法
8975
查看次数

舍入双打 - .5 - sprintf

我正在使用以下代码舍入到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.还有其他(更优雅)的想法吗?

c++ printf rounding

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

printf中"%.6d"是什么意思

这是什么%.6d意思的:

printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);
Run Code Online (Sandbox Code Playgroud)

这是一个错字吗?

它似乎%.6d是一样的%6d.

c formatting printf

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

printf语句是如何解释的?

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)

为什么编译器从第六个字符开始打印?

c printf programming-languages

9
推荐指数
3
解决办法
5988
查看次数

如何使用printf样式记录参数创建F#函数?

我正在尝试创建一个框架来处理文件和数据.我正在努力解决的一个领域是如何为框架提供日志记录功能,允许框架在不知道正在使用的日志记录的情况下报告消息.

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)

理想情况下,我希望此代码可以工作,但我无法确定如何传递记录器功能.

printf f#

9
推荐指数
2
解决办法
1773
查看次数

在PHP变量中设置printf()值

我有一个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)

//我们都知道它不起作用,但如何设定?

php printf floating

9
推荐指数
1
解决办法
7808
查看次数

Posix是否为printf/scanf提供格式字符串宏?

的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类型的所有变化.如何在格式字符串中可移植地使用这些类型?

c c++ printf posix

9
推荐指数
1
解决办法
471
查看次数

使用printf格式的变量

假设我有一个这样的文件:

$ 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)

理想情况下,我想知道是否可以这样做.如果不是,那么最好的解决方法是什么?

awk printf awk-formatting

9
推荐指数
2
解决办法
5783
查看次数

当printf的相应参数不是short/char时,使用h或hh长度修饰符是不合法的吗?

该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 …

c printf short undefined-behavior language-lawyer

9
推荐指数
1
解决办法
426
查看次数