我有一个值为57.400002的浮点数.我用来sprintf_s在GUI上显示值.
sprintf_s(xPosition, 19, "%f", xPositionValue);
Run Code Online (Sandbox Code Playgroud)
如何格式化浮点数,使其显示为57.40?
我正在寻找一种方法来传递一个FILE *函数,以便函数可以写入它fprintf.如果我想让输出在磁盘上的实际文件中出现,这很容易.但我想要的是将所有输出作为字符串(char *).我喜欢的那种API是:
/** Create a FILE object that will direct writes into an in-memory buffer. */
FILE *open_string_buffer(void);
/** Get the combined string contents of a FILE created with open_string_buffer
(result will be allocated using malloc). */
char *get_string_buffer(FILE *buf);
/* Sample usage. */
FILE *buf;
buf = open_string_buffer();
do_some_stuff(buf); /* do_some_stuff will use fprintf to write to buf */
char *str = get_string_buffer(buf);
fclose(buf);
free(str);
Run Code Online (Sandbox Code Playgroud)
在glibc的头似乎表明,一个文件可能被设置了挂钩函数来执行实际的读写.在我的情况下,我想我希望写钩子将字符串的副本附加到链表,并且有一个get_string_buffer函数可以计算出列表的总长度,为它分配内存,然后将每个项目复制到它在正确的地方.
我的目标是可以传递给函数的东西,比如do_some_stuff …
我在屏幕上使用qDebug()Qt框架printf.当我从Qt Creator运行应用程序时它工作得很好,但是当我尝试从Windows执行它时cmd它什么也没显示.为什么会这样?
How do I print a Chinese or Japanese character (non-English) in C?
wchar *wc = (wchar *)calloc(50,sizeof(wchar*));
wcscpy(wc ,L"john ???");
printf(" wc : %S \n",wc);
Run Code Online (Sandbox Code Playgroud)
I got john only in my output.
读完这篇文章后,我开始认为我已经学会了一个战利品printf().突然,我发现从下面的代码片段这本书:
int main()
{
char str[]="Hello";
int i=5,j=10;
printf(i>j?"%50s":"%s",str); //unable to understand this
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,上面的代码运行没有错误,它打印Hello.根据我的知识,以下是语法printf():
int printf(const char *format,argument_list);
Run Code Online (Sandbox Code Playgroud)
所以根据这种语法,printf()应该从格式字符串开始.但正如您在上面的代码中printf()所看到的那样i>j.
这是否意味着我在解释printf()的语法时出错了?将三元运算符放在printf()中是一种特殊情况吗?
编辑
我知道三元运算符我问的第一个参数printf()应该是const char*,我似乎不在我的例子中.
我试图从数据中Matlab的将被其他应用程序可以理解的格式导出......对,我需要改变NaN,Inf并-Inf串(即Matlab的打印默认情况下,这样的值)//m,//inf+和//Inf-.
一般来说,我知道如何实现这一目标.我在询问如何(以及是否可能)在Matlab中利用一个特定的东西.实际问题位于最后一段.
我尝试过两种方法(代码如下).
sprintf()的数据和strrep()输出.这是以逐行方式完成的,以节省内存.该解决方案的时间比简单多出近10倍fprintf().优点是它具有低内存开销.Run Code Online (Sandbox Code Playgroud)rows = 50000 cols = 40 data = rand(rows, cols); % generate random matrix data([1 3 8]) = NaN; % insert some NaN values data([5 6 14]) = Inf; % insert some Inf values data([4 2 12]) = -Inf; % insert some -Inf values fid = fopen('data.txt', 'w'); …
我知道声明printf是:
int printf ( const char * format, ... );
Run Code Online (Sandbox Code Playgroud)
这意味着可以直接打印字符串而不是使用%s和字符串作为参数.请参阅以下代码:
char str[50];
char *ptr;
//initialize str and ptr
printf(str); //BAD
printf(ptr); //BAD
printf("%s",str); //GOOD
printf("%s",ptr); //GOOD
Run Code Online (Sandbox Code Playgroud)
我已经读过直接打印字符串,如前两个printfs所示是坏的,应该总是避免这样做.相反,使用%s最后两个printfs中显示的更好.它们都正确打印两个字符串.
那么,为什么使用%s打印字符串printf而不是直接打印它更好呢?
当一个人不使用%s打印字符串时会出现什么问题printf?
我目前编程自己的实现printf,这里是代码:
int my_printf(const char *format, ...)
{
//Declare variable ou prog fonctionnel????
va_list args;
int numberValue;
unsigned int unsignedNumberValue;
double doubleValue;
char* stringValue;
char charValue;
va_start(args, format);
for(int i = 0; format[i]; i++){
//This case is the most called case, so we test it first to get the
//best perfs
if(format[i] != '%'){
my_put_char(format[i]);
}else{
if(format[i+1] == 'd' || format[i+1] == 'i'){
numberValue = va_arg(args, int);
my_put_nbr(numberValue);
}else if(format[i+1] == 'u'){
unsignedNumberValue = va_arg(args, unsigned int);
my_put_nbr_unsigned(unsignedNumberValue);
}else …Run Code Online (Sandbox Code Playgroud) 我试图得到一些使用相同宽度格式化的浮点数fmt.Printf().
例如,给定浮点值0.0606060606060606,0.3333333333333333,0.05,0.4和0.1818181818181818,我想将每个值格式化为10符文:
0.06060606
0.33333333
0.05
0.4
0.18181818
Run Code Online (Sandbox Code Playgroud)
但我无法理解它是如何完成的.文档说
对于浮点值,width设置字段的最小宽度,precision设置小数点后的位数(如果适用),但%g /%G除外,它设置总位数.例如,给定123.45格式%6.2f打印123.45而%.4g打印123.5.%e和%f的默认精度为6; 对于%g,它是唯一标识值所需的最小位数.
因此,如果我使用%f较大的数字将不适合10个字符的约束,因此%g是必需的.要获得最小宽度为10 %10g并获得最大数量的9位数(点的+1)%.9g,但将它们组合起来%10.9g并不像我期望的那样
0.0606060606
0.333333333
0.05
0.4
0.181818182
Run Code Online (Sandbox Code Playgroud)
为什么我得到10符文的字符串,其他的符文是11符文,其他符号是12符文?
特别是,似乎%.9g总共不产生9位数.参见例如:http://play.golang.org/p/ie9k8bYC7r
为什么这样做?(即如何传递int给printf()打印字符串的结果)
#include<stdio.h>
int main() {
int n="String";
printf("%s",n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
警告:初始化从指针生成整数而没有强制转换[默认情况下启用]
int n ="String";
警告:格式'%s'需要类型'char*'的参数,但参数2的类型为'int'[-Wformat =]
printf("%s",n);
输出:字符串
编译器:gcc 4.8.5