可能重复:
我应该在我的C++代码中使用printf吗?
如果我只想string在屏幕上打印,我可以使用以下两种方式:
printf("abc");
std::cout << "abc" << std::endl;
Run Code Online (Sandbox Code Playgroud)
案例是,并且在上面显示的例子中,有使用printf结束的优点std::cout,反之亦然?
#include <stdio.h>
#include <float.h>
int main()
{
printf("%f\n", FLT_MAX);
}
Run Code Online (Sandbox Code Playgroud)
GNU的输出:
340282346638528859811704183484516925440.000000
Run Code Online (Sandbox Code Playgroud)
Visual Studio的输出:
340282346638528860000000000000000000000.000000
Run Code Online (Sandbox Code Playgroud)
C和C++标准是否允许这两种结果?或者他们是否要求特定的结果?
请注意FLT_MAX = 2^128-2^104 = 340282346638528859811704183484516925440.
最近,有时(很少)从我们的应用程序导出数据时,导出日志包含看起来像"-1.#J"的浮点值.我无法重现它所以我不知道浮点数在二进制文件中是什么样的,或者Visual Studio如何显示它.
我试着查看printf的源代码,但没有找到任何东西(不是100%肯定我看了正确的版本虽然...).
我试过谷歌搜索但谷歌抛出任何#,似乎.我找不到任何浮动错误列表.
我写了这个小代码:
#include <stdio.h>
int main() {
size_t temp;
temp = 100;
printf("lld=%lld, ld=%ld, u=%u\n", temp, temp, temp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在带有gcc版本4.1.1 20070105(Red Hat 4.1.1-52)的i386 GNU/Linux机器上运行它.这是我得到的输出:
lld=429496729700, ld=100, u=7993461
Run Code Online (Sandbox Code Playgroud)
我可以理解第一个(lld)被打印为垃圾,因为当变量中只有4个字节可用时,printf尝试打印8个字节(用于signed long long表示lld)temp.但是,我无法理解为什么最后一个标识符u被打印为垃圾 - 而在我的理解中,这是最接近的适用标识符size_t.
这里我假设size_t是unsigned int(我的i386签名为4个字节).
现在,我对该printf线进行了一些调整:
...
printf("ld=%ld, u=%u, lld=%lld\n", temp, temp, temp);
...
Run Code Online (Sandbox Code Playgroud)
我有一个非常好的答案(lld部分除外).
ld=100, u=100, lld=34331653576851556
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解我在这里错过了什么吗?
非常感谢您的帮助!
[旁注:我尝试使用gcc -O[0,2]标签开/关切换优化,但观察结果没有任何差异.]
我想知道是否:
void *ptr = NULL;
printf("%p\n", ptr);
Run Code Online (Sandbox Code Playgroud)
会不会给出(nil)输出?
它是依赖于标准库实现,还是C99标准规范?
当我运行程序时,阶乘值右对齐.有没有办法让它左对齐,同时保持其间的50个空格?
public class Exercise_5_13
{
public static void main( String[] args )
{
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20 };
long factorial = 0;
try
{
System.out.print("\n\n");
System.out.printf("%s%50s\n", "Integer", "factorial");
for ( int number : numbers )
{
System.out.printf( "%4d", number);
factorial = (long)1;
for(int i=1; i <= number; i++)
factorial = factorial * (long)i;
System.out.printf("%50.0f\n",(double)factorial);
}
System.out.print("\n\n");
}
catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 我很好奇printfLinux内部的工作原理.我不明白它是如何写入数据的STDOUT.
在对内部进行了一些搜索之后,我下载glibc并查看了源代码:
__printf (const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done = vfprintf (stdout, format, arg);
va_end (arg);
return done;
}
Run Code Online (Sandbox Code Playgroud)
在找到这个之后,我深入研究了这个vfprintf函数 - 但该文件大约有2500行不熟悉的C代码.我正在寻找10,000英尺的解释,如何printf与计算机的内存和输出一起工作,以在屏幕上显示字符.
如果我是汇编代码,我还需要做些什么才能完成相同的任务?它依赖于操作系统吗?
我不太熟悉C语言并在Linux中进行编译,但我有一些问题要求并希望你能提供帮助.
我有这行代码使用已安装的命令及其参数来加入域.(见图).在我运行gcc join.c编译之后,它创建了一个文件a.out.到目前为止这么好,但是当我vim a.out查看该文件的内容时,我看到mypassword可以通过简单的文本编辑器轻松查看.(见第二张图)
编译我的C代码时,有什么办法可以避免这种情况吗?
#include <stdio.h>
#include <unistd.h>
int main ()
{
printf("Running 'net join' with the following parameters: \n");
char *domain="mydomain";
char *user="domainjoinuser";
char *pass="mypassword";
char *vastool="/opt/quest/bin/vastool";
char *ou="OU=test,DC=mtdomain,DC=local";
char unjoin[512];
sprintf(unjoin,"/opt/quest/in/vastool -u %s -w '%s' unjoin -f",user,pass);
printf("Domain: %s\n",domain);
printf("User: %s\n",user);
printf("-----------------\n");
printf("Unjoin.............\n");
system(unjoin);
printf("Join................\n");
execl("/opt/quest/bin/vastool", "vastool", "-u", user, "-w", pass, "join", "-c", "ou", "-f", domain, (char*)0);
}
Run Code Online (Sandbox Code Playgroud)

00000000 7f 45 4c 46 02 01 01 00 00 00 …
fprintf()家庭的功能有5级标志人物'-','+',' ','#','0'.
重复标志时指定的行为(如果有)是什么?
#include <stdio.h>
int main(void) {
printf("% d\n", 12); // 12
printf("%00d\n", 34); // 34
printf("%++d\n", 56); // +56
printf("%00*d\n", 5, 78); // 00078
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用我的gcc"i686-pc-cygwin/4.9.2",我收到"警告:重复''标志格式[-Wformat =]",所以我认为这是一个正确的行为 - >警告用户并允许重复标记.
在尝试编写格式解析器时,我还没有找到针对此角落问题的C99/C11规范指南.
如果重复允许,以下代码就可以了.如果不允许重复,则第二个0是宽度.然后,说明符具有2米的宽度0和*,这是另一个问题.
// -------v
printf("%00*d\n", 5, 78); // 00078
Run Code Online (Sandbox Code Playgroud) 我想printf()用动态参数控制函数输出格式,如下面的代码所示:
#include<stdio.h>
int main(int argc,char ** argv)
{
printf(argv[1],"hello,world");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我编译并运行它:
$ gcc -o test test.c
$ ./test "\t%s\n"
Run Code Online (Sandbox Code Playgroud)
结果很奇怪:
\thello,world\n$
Run Code Online (Sandbox Code Playgroud)
为什么"\n"而且"\t"没有效果?