printf的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了printf的问题相关的知识,希望对你有一定的参考价值。

1、我想问下,printf这个函数的输出是在DOS下显示的,这是不是说这个函数有一个关于DOS的windows的系统调用呢?
2、在linux系统下,没有DOS,printf调用别的程序显示,这是不是说在windows和linux下的printf函数源代码是有差别的呢?
谢谢!
命令行不是DOS么,那dos是什么?

首先,总结性地回答:
windows和linux和Dos三种操作系统的printf源码应该是略有区别的。
其次,介绍一下printf的底层显示函数。
printf是在屏幕上打印一个字符串的函数。
(注:数字其实也是按照字符的形式显示在屏幕上的。)
因为printf其实是解析format格式,例如%d,\n,等等。

真正在屏幕上显示的函数是决定与操作系统底层的。
也就是都是调用底层的显示策略函数实现的在屏幕的指定位置进行显示。

例如:stdio.h中的printf.c的源码中:
printChar函数就是顶层的显示策略函数。

code]int putchar (int c)
switch ((unsigned char) c)
case '\n' :
newLine ();
break;
case '\r' :
carriageReturn ();
break;
case '\f' :
clearScreen ();
break;
case '\t' :
printChar (32); printChar (32); /* 32 = space */
printChar (32); printChar (32);
printChar (32); printChar (32);
printChar (32); printChar (32);
break;
case '\b':
backspace ();
break;
case '\a':
beep ();
break;
default :
printChar ((unsigned char) c);

return c;
[/code]

接下来看printChar也就是输出部分最低层的操作咯

[code]void printChar (const byte ch)
*(word *)(VIDEO + y * 160 + x * 2) = ch | (fill_color << 8);
x++;
if (x >= WIDTH)
newLine ();
setVideoCursor (y, x);
[/code]这里VIDEO表示显存地址也就是0xB8000.通过 y * 160 + x 屏幕(x,y)坐标在显存中的位置.这里需要知道,一个字符显示需要两个字节,一个是ASCII码,第二个是字符属性代码也就是颜色代码.因此才必须 y * 80 * 2 + x = y * 160 + x.那么ch | (fill_color << 8)也自然就是写入字符及属性代码用的了.每写一个字符光标位置加1,如果大于屏幕宽度WIDTH就换行.最后通过setVideoCursor设置新的光标位置.完成了整个printChar过程.
参考技术A 没有差别

Dos和Windows和Linux都是操作系统。

调用的是命令行窗口不是DOS系统。
参考技术B 系统调用和库函数是有区别的 参考技术C 输出是:
y=-43456
y=-43456
y=-0043456
y=
-43456
‘-’代表左对齐,8个字符,那么就补2个空格
‘0’表示如果不是左对齐,并且没有写满,那么空格处补0
‘+’是右对齐
参考技术D 你说的错了是哪一方面?语法还是结果?如果是语法的话在int
main()
的括号里加一个void,不过int型的主函数有很多编译程序不认识,还有最好把getch();改成getchar();以便被更多的编译程序所认识,要是说结果有问题的话应该把1065/(24*13)改成1065.0/(24*13),两个运算数至少要有一个带小数才能用%f输出的

注意括号匹配的问题

 

int main()
{
    int a = 3;

    printf("a = %d\n",a);
    printf("Case 1:");
    if (a > 0) {
        if (a > 5)
            printf("a > 5");
    }
    else {
            printf("a <= 0");
    }
    printf("--\n");

    printf("Case 2:");
    if (a > 0)
        if (a > 5)
            printf("a > 5");
    else
            printf("a <= 0");
    printf("--\n");
    return 0;
}

 

上面两个Case 的代码作用相同吗?是不是都不会输出?

执行结果:

a = 3
Case 1:--
Case 2:a <= 0--

其实就是个if else 配对的问题了,注意下就好了。所以尽量单语句也要加括号,避免不必要的麻烦。

 

以上是关于printf的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 printf 打印“-”

C语言里面float数据用printf(“%d”)输出的问题

C语言float类型储存和printf输出问题

C语言里面float数据用printf(“%d”)输出的问题

printf() 中的赋值运算符问题

如何在 C++ 中使用 printf [关闭]