String格式表达式:
'This is %d %s example!' % (1, 'nice')
Run Code Online (Sandbox Code Playgroud)
字符串格式化方法调用
'This is {0} {1} example!'.format(1, 'nice')
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢方法调用(第二个例子)的可读性,但由于它是新的,因此有可能随着时间的推移,这些中的一个或另一个可能会被弃用.您认为哪个不太可能被弃用?
在C中,是否可以在sprintf函数中使用递归?出于某种原因,当我这样做时,我遇到了分段错误:
inline char *TreeNode_toString(const TreeNode *node)
{
char *out;
if(TreeNode_isExternal(node)) // If the node has no children...
{
sprintf(out, "%s:%.2f", node->name, node->distance);
}
else // The node is strictly binary, so it will have two non-null children
{
char *l = TreeNode_toString(node->l); // l = left child
char *r = TreeNode_toString(node->r); // r = right child
sprintf(out, "(%s,%s):%.2f", l, r, node->distance);
}
return out;
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于使用printf的问题.
char str[8];
float val = 2.334563;
sprintf(str, format, val);
printf("val = %s.\n", str);
val = -23.34563;
sprintf(str, format, val);
printf("val = %s.\n", str);
val = -0.02334563;
sprintf(str, format, val);
printf("val = %s.\n", str);
val = 233;
sprintf(str, format, val);
printf("val = %s.\n", str);
Run Code Online (Sandbox Code Playgroud)
预期的产出如下:
val = +2.3345
val = -23.345
val = -0.0233
val = +233.00
Run Code Online (Sandbox Code Playgroud)
我需要什么格式字符串?感谢您的关注.
我有一个非常奇怪的问题/ bin/bash和一个使用printf格式化字符串的脚本.
我的脚本看起来像这样
rt=$(printf "%.3f" 13.234324245)
Run Code Online (Sandbox Code Playgroud)
差异,我计算数字13.23 ...以上.当我使用/ usr/bin/zsh时效果很好!偶然/ bin/sh可以做到(但它不能做if if ...)最大的问题是/ bin/bash似乎不理解printf或者当我不使用时确实有另一种格式化方式LANG=C.
我的LANG变量设置为de_AT.UTF-8然后我得到此错误:
/path/to/script: Zeile 12: printf: 13.234324245: Ungültige Zahl.
Run Code Online (Sandbox Code Playgroud)
所以它只是说我给printf的数字无效......
我需要以不同的方式运行printf吗?
编辑:问题似乎是在计算数字:
rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉bc使用a ,而不是.?
在C你有"%c"和"%f"的格式标志printf-和scanf式的功能.这两个功能的使用可变长度参数...,它总是转换floats到doubles和chars到ints.
我的问题是,如果这种转换发生,为什么做独立的标志char和float存在吗?为什么不只使用相同的标志int和double?
我制作了一个接受字符串(名字/姓氏)的程序,但是我不是
3岁的Phil Snowken 的典型输出,而是3 岁的
Phil
Snowken
#include <stdio.h>
#define N 10
struct data{
char fname[30];
char lname[30];
int age;
};
main()
{
int i;
struct data base[N];
for(i=0;i<N;i++){
printf("\n-------------------------");
printf("\nPeople Data(%d remaining)\n",N-i);
printf("---------------------------\n\n");
printf("\nFirst Name ");
fgets(base[i].fname,30,stdin);
printf("\nLast Name ");
fgets(base[i].lname,30,stdin);
printf("\nAge ");
scanf(" %d",&(base[i].age));
fflush(stdin);
}
for(i=0;i<N;i++)
printf("%s %s Year:(%d)",base[i].fname,base[i].lname,base[i].age);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我注意到,当我编译这个iniparser时,它会发出以下警告:
src/iniparser.c:244:5: warning: implicit declaration of function ‘snprintf’ [-Wimplicit-function-declaration]
snprintf(keym, secsize, "%s:", s);
Run Code Online (Sandbox Code Playgroud)
据推测,解决方案是:
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
我尝试过这个,但仅此一点并没有解决问题.然后我查看了Makefile里面的编译标志,发现了这个:
CFLAGS += -fPIC -Wall -ansi -pedantic
Run Code Online (Sandbox Code Playgroud)
如果我改为:
CFLAGS += -fPIC -Wall -std=c99 -pedantic
Run Code Online (Sandbox Code Playgroud)
它编制了一个警告.这是否意味着C90标准不包括snprintf?有人可以向我解释这种行为吗?
我正在尝试更新一些"遗留"代码,以符合MSVC的最新安全更新,并且我正面临着迁移_vsnprintf到的一些问题_vsnprintf_s.
特别是,我_vsnprintf使用空缓冲区调用,为计数/长度调用零,获取结果,分配所需大小的缓冲区(return value + 1),然后_vsnprintf使用新分配的缓冲区和已知正确的大小再次调用:
size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
Run Code Online (Sandbox Code Playgroud)
如果count指定的缓冲区大小不足以包含format和argptr指定的输出,则vsnprintf的返回值是count(如果count足够大)将写入的字符数.如果返回值大于count-1,则输出已被截断.
我正在尝试做同样的事情_vsnprintf_s,但它的文档不包含相同的内容.相反,它说
如果存储数据和终止空值所需的存储超过sizeOfBuffer,则调用无效参数处理程序,如参数验证中所述,除非count为_TRUNCATE,在这种情况下,将写入适合缓冲区的字符串,并且 - 1回来了.
无论如何都要尝试以下内容:
size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
Run Code Online (Sandbox Code Playgroud)
这导致"长度"为零.如果您传入_TRUNCATE(-1)作为计数,则以下断言失败:
表达式:buffer!= nullptr && buffer_count> 0
我认为可以覆盖_set_invalid_parameter_handler并以某种方式找出长度应该是多少,但是必须有一种更简单的方法吗?
我打印的是Tic-Tac-Toe板.我有一个字符串,用于电路板的每个单元格和电路板的格式字符串.我现在正在做:
let cells = [| 'X'; 'O'; 'X'; 'O'; 'X'; 'O'; ' '; ' '; ' ' |]
printfn ".===.===.===.\n\
| %c | %c | %c |\n\
.===.===.===.\n\
| %c | %c | %c |\n\
.===.===.===.\n\
| %c | %c | %c |\n\
.===.===.===.\n" cells.[0] cells.[1] cells.[2] cells.[3] cells.[4] cells.[5] cells.[6] cells.[7] cells.[8]
Run Code Online (Sandbox Code Playgroud)
有没有办法将cells数组提供给printfn而不显式枚举数组中的所有9个项目?我可以用某种方式使用Array.fold或kprintf吗?
我正在运行一个快速测试,以确保我的指针算术运算:
main.c中
#include <stdio.h>
#include <stdlib.h>
#define ADDRESS 0xC0DCA11501LL
#define LENGTH 5
void print_address( char *, char );
/* Main program */
int main( int argc, char *argv[] )
{
char nums[ LENGTH ];
/* LSB first */
for( int i = 0; i < LENGTH; i++ )
{
nums[ i ] = ( ADDRESS >> ( 8 * i ) ) & 0xFF;
}
print_address( nums, LENGTH );
system("PAUSE");
return 0;
}
void print_address( char *data, char len ) …Run Code Online (Sandbox Code Playgroud)