int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
Run Code Online (Sandbox Code Playgroud) 有没有办法在没有结束换行的情况下从MATLAB程序输出/显示信息?
我的MATLAB程序偶尔会输出一个数字.在输出数字之间,程序会执行许多其他操作.这是一个主要用于表示某种进展的构造,每次都不能有换行,只是为了让它对用户更具可读性.这大约是我正在寻找的:
Current random seed:
4 7 1 1
Run Code Online (Sandbox Code Playgroud)
如果程序仍然像以前一样做,那么程序的下一个输出将在同一行上.
我已经阅读了有关disp,sprintf和格式的文档,但还没有找到我正在寻找的内容.这并不意味着它不存在.;)
我之前从未使用过这些函数,但在阅读了很多关于sprintf()之后,我决定知道它.
所以我继续做下面的事情.
function currentDateTime() {
list($micro, $Unixtime) = explode(" ",microtime());
$sec= $micro + date("s", $Unixtime);
$sec = mb_ereg_replace(sprintf('%d', $sec), "", ($micro + date("s", $Unixtime)));
return date("Y-m-d H:i:s", $Unixtime).$sec;
}
sprintf(currentDateTime());
Run Code Online (Sandbox Code Playgroud)
它什么都不打印.另一方面使用printf()函数:
printf(currentDateTime());
Run Code Online (Sandbox Code Playgroud)
它打印结果就好了.那么这两个函数之间的区别是什么?如何正确使用sprintf()函数?
我这样使用snprintf以避免缓冲区溢出:
char err_msg[32] = {0};
snprintf(err_msg, sizeof(err_msg) - 1, "[ ST_ENGINE_FAILED ]");
Run Code Online (Sandbox Code Playgroud)
-1如果字符串长度超过32个字节,我为null终止符添加了保留空间.
我的想法是否正确?
平台:
我有一个我想要打印的字符串.当我使用cout它时,它输出完美但是使用printf它会损坏它.
这是代码:
int main ( int argc, char *argv[] )
{
// Check to make sure there is a single argument
if ( argc != 2 )
{
cout<<"usage: "<< argv[0] <<" <filename>\n";
return 1;
}
// Grab the filename and remove the extension
std::string filename(argv[1]);
int lastindex = filename.find_last_of(".");
std::string rawname = filename.substr(0, lastindex);
cout << "rawname:" << rawname << endl;
printf("rawname: %s", rawname);
}
Run Code Online (Sandbox Code Playgroud)
该cout给我"rawname:文件"
中printf给了我"rawname:",然后一串字符的波浪
我想要一个最小的o-damn-malloc-just-failed处理程序,它将一些信息写入文件(可能只是标准错误).我更喜欢使用fprintf()而不是write(),但如果fprintf()本身尝试使用malloc(),则会失败.
是否有一些保证,无论是在C标准,还是只是在glibc,fprintf不会这样做?
以下代码生成2个警告,这些警告在问题标题中描述.
#include <stdio.h>
static void _print_f(float *f){printf("float : %f\n", *f);}
static void _print_i(int *i) {printf("int : %d\n", *i);}
#define print(num) _Generic((num), \
int* : _print_i(num), \
float* : _print_f(num))
int main(void)
{
print((&(int){10}));
print((&(float){10.f}));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
int : 10
float : 10.000000
Run Code Online (Sandbox Code Playgroud)
我知道,这个宏可以写成如下:
#define print(num) _Generic((num), \
int* : _print_i, \
float* : _print_f)(num)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不会有任何警告,但我的例子是我写的一个虚拟片段来证明问题.在我的真实代码库中,我选择了以前的解决方案,因为其他一些"默认"但类型特定的参数需要传递给选定的函数.
所以问题是:即使宏正在按预期工作,输出正是我所期望的,为什么会产生警告?
旗帜与环境:
/* Mac OS X 10.9.4
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) */
cc -Wall -v -g -std=c11 …Run Code Online (Sandbox Code Playgroud) 我知道打印int我们可以使用%d,string我们可以使用,%s
但我们仍然可以%v用来打印它们.那么如果我总是用它%v来打印呢?如果我这样做会发生什么问题?
我%p在Stack Overflow中已经阅读了很多关于C语言中格式说明符用法的答案,但似乎没有一个解释为什么void*所有类型都需要显式转换为char*.
我当然知道这样一个事实,即强制转换的要求void*与使用可变函数(参见本答案的第一条评论)有关,而非强制性要求.
这是一个例子:
int i;
printf ("%p", &i);
Run Code Online (Sandbox Code Playgroud)
产生关于类型不兼容性的警告,并且&i应该进行铸造void*(根据标准的要求,再次参见此处).
虽然这一大块代码能够顺利编译,但没有关于类型转换的任何投诉:
char * m = "Hello";
printf ("%p", m);
Run Code Online (Sandbox Code Playgroud)
如何char*从这一要求中"解脱"?
PS:可能值得补充的是我在 x86_64架构上工作,因为指针类型大小依赖于它,并且使用 gcc作为linux上的-W -Wall -std=c11 -pedantic编译器和编译选项.
考虑浮点数0.644696875。让我们使用Java和C将其转换为带有八个小数的字符串:
import java.lang.Math;
public class RoundExample{
public static void main(String[] args){
System.out.println(String.format("%10.8f",0.644696875));
}
}
Run Code Online (Sandbox Code Playgroud)
结果:0.6446968 8
自己尝试:http : //tpcg.io/oszC0w
#include <stdio.h>
int main()
{
printf("%10.8f", 0.644696875); //double to string
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:0.6446968 7
自己尝试:http : //tpcg.io/fQqSRF
为什么最后一位数字不同?
数字0.644696875无法完全表示为机器编号。它表示为分数2903456606016923/4503599627370496,其值为0.6446968749999999
诚然,这是一个极端情况。但是我真的很好奇差异的根源。
相关:https : //mathematica.stackexchange.com/questions/204359/is-numberform-double-rounding-numbers