标签: printf

glibc是否实现了fprintf()线程安全?

fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入.

编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程.

查看该文件,一些写入混合在一起.

编辑2:我看到的问题似乎可能是由于lighttpd的"工作线程"实际上是单独的进程: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

问题

通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点:

  • mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步.
  • mod_status将有n个独立的计数器,每个进程一个.
  • mod_rrdtool将失败,因为它收到两次相同的时间戳.
  • mod_uploadprogress将不会显示正确的状态.

c printf multithreading posix lighttpd

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

为什么scanf不需要字符串的&符号,并且在printf(在C中)也可以正常工作?

我现在正在学习C中的字符串.

如何使用scanf来获取你可以做的字符串

scanf("%s",str1);
Run Code Online (Sandbox Code Playgroud)

而对于printf,你可以做到

printf("The string is %s\n", str1);
Run Code Online (Sandbox Code Playgroud)

我理解,对于scanf来说,这是因为字符串只是一个字符数组,它是一个指针,但是对于printf,你怎么能像变换int或float一样放置变量名?

c string printf pointers scanf

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

重用va_list

我需要做两次(或更多次)传球va_list.我有一个大小的缓冲区,我想用sprintf写一个格式化的字符串.如果格式化的字符串不适合分配的空间,我想要将分配的空间加倍并重复直到它适合.

(作为旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但我发现可以做到的唯一功能是_snprintf,并且在VS2005中不推荐使用...)

现在,到目前为止没有问题:我在每次调用之前使用vsnprintf和va_start调用.

但我还创建了一个函数,它将a va_list作为参数,而不是"......".然后我不能再使用va_start了!我已经读过了va_copy,但VS2005不支持它.

那么,你会怎么做?

c printf visual-studio-2005

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

精度说明符作为参数,如printf但在String.Format中

使用printf我可以使用*将精度值指定为额外参数.C#String.Format中是否存在相同的功能?

编辑:例如:

Console.WriteLine("{0:D*}",1,4); // Outputs 0001
Run Code Online (Sandbox Code Playgroud)

c# string printf string-formatting

8
推荐指数
1
解决办法
4245
查看次数

在c ++中打印变量名的通用方法

给一堂课

struct {
  int a1;
  bool a2;
  ...
  char* a500;
  ...
  char a10000;      
}
Run Code Online (Sandbox Code Playgroud)

我想打印或流出

"a1 value is SOME_VALUE"  
"a2 value is SOME_VALUE"
"a500 value is SOME_VALUE"
...
"a10000 value is SOME_VALUE"
Run Code Online (Sandbox Code Playgroud)

成员变量的类型不一样(主要是int,bool,char*等,也就是说,不需要重载<<运算符),成员变量名可以用任何东西命名,即没有遵循的规则.而不是逐个明确地输入(非常繁琐且容易出错的工作),有没有通用的方法?

谢谢你的评论!

c++ variables printf iostream

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

在awk中打​​印长整数

我有一个管道分隔的feed文件,它有几个字段.由于我只需要一些,我想用它awk来捕获它们用于我的测试目的.但是,我注意到printf如果我使用它会更改值"%d".如果我使用,它工作正常"%s".

Feed文件示例:

[jaypal:~/Temp] cat temp

302610004125074|19769904399993903|30|15|2012-01-13 17:20:02.346000|2012-01-13 17:20:03.307000|E072AE4B|587244|316|13|GSM|1|SUCC|0|1|255|2|2|0|213|2|0|6|0|0|0|0|0|10|16473840051|30|302610|235|250|0|7|0|0|0|0|0|10|54320058002|906|722310|2|0||0|BELL MOBILITY CELLULAR, INC|BELL MOBILITY CELLULAR, INC|Bell Mobility|AMX ARGENTINA SA.|Claro aka CTI Movil|CAN|ARG|

我有兴趣捕捉second column它是哪个19769904399993903.

这是我的测试:

[jaypal:~/Temp] awk -F"|" '{printf ("%d\n",$2)}' temp
19769904399993904   # Value is changed
Run Code Online (Sandbox Code Playgroud)

但是,以下两个测试工作正常 -

[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903   # Value remains same

[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903   # Value remains same
Run Code Online (Sandbox Code Playgroud)

所以这是一个"%d"无法处理长整数的限制.如果是这样的话,为什么会在数字中加一个而不是截断呢?

我试过这个BSD和GNU版本的awk. …

printing awk printf gawk

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

C中的通用编程

我正在用纯C编写通用链表实现.

struct Node {
    void *value;
    struct Node *next;
};

struct LinkedList {
    struct Node *start;
    struct Node *end;
};

void LinkedList_new(struct LinkedList* llist) {
    llist->start = 0;
    llist->end = 0;
    return;
}

void addNode( struct LinkedList *ll, void *_value ) {
    if ( NULL == ll->start ) {
        ll->start = (struct Node *) malloc( sizeof(struct Node) );
        ll->end = ll->start;
    } else {
        ll->end->next = (struct Node *) malloc( sizeof(struct Node) );
        ll->end = ll->end->next;
    }
    ll->end->value = _value; …
Run Code Online (Sandbox Code Playgroud)

c generics printf generic-programming void-pointers

8
推荐指数
1
解决办法
7206
查看次数

printf格式为1字节有符号数

假设如下:

sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
Run Code Online (Sandbox Code Playgroud)

对于4字节有符号数,printf2字节有符号数的格式%hd是%d,对于8字节有符号数%ld,但是1字节有符号数的正确格式是什么?

c printf

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

printf("%.d", 0) 和 printf("%.1d", 0) 有什么区别?

我正在重新编码printf,现在我被精度标志阻止了一会儿。所以我读到类型转换说明符d为 1时的默认精度:

默认精度

所以我认为%.dand之间没有区别%.1d,但是当我测试时:

printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud)

我确实找到了一个:

printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud)

c precision io formatting printf

8
推荐指数
2
解决办法
151
查看次数

混淆 .fmt 行为与嵌套列表

文档说​fmt

\n
\n

返回一个字符串,其中列表中的每个元素均已根据$format[第一个参数] 进行格式化,并且每个元素均由$separator[第二个参数] 分隔。

\n
\n

根据该描述,我希望能够调用.fmt列表列表,然后传递一个printf-style 格式字符串,其中%包含内部列表中每个元素的指令。但这是行不通的。

\n

如果您告诉我我对 ^^^^ 的看法是错误的,我会期望它.fmt会自动展平其参数,因此每个参数都会被格式化并由$separator. 但事实并非如此。

\n

相反,运行此代码

\n
\nsay (<a b c>, <1 2 3>, <X Y Z>).fmt(\'\xe2\x86\x92%03s|\', "\\n=================\\n");\n
Run Code Online (Sandbox Code Playgroud)\n

产生这个输出:

\n
\xe2\x86\x9200a| \xe2\x86\x9200b| \xe2\x86\x9200c|\n=================\n\xe2\x86\x92001| \xe2\x86\x92002| \xe2\x86\x92003|\n=================\n\xe2\x86\x9200X| \xe2\x86\x9200Y| \xe2\x86\x9200Z|\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(不使用格式字符串;注意 每个|和\xe2\x86\x92字符之间),然后在每个外部列表之间插入分隔符列表之间插入分隔符。

\n

这给我留下了三个问题:

\n
    \n
  1. 我是否正确描述/理解了当前的行为?[编辑:不。见下文]
  2. \n
  3. 这种行为是故意的还是奇怪的错误?(我检查了 Roast,但没有看到任何东西)
  4. \n
  5. 假设这是故意的,为什么?有什么方法可以使这与 …

formatting printf nested-lists rakudo raku

8
推荐指数
1
解决办法
185
查看次数