VS2012控制台输出乱码

输出有乱码
在想是不是gets和printf一起用的问题
但不知道解决方法
求解决

img

img

img

img

img

img

字符串未初始化

setup() 函数树的生成不正确。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7777927
  • 这篇博客也不错, 你可以看下一种通过printf打印的调试程序的方法
  • 除此之外, 这篇博客: 【纯干货】深度底层剖析,你所不知道的printf中的 格式符是什么时候被解析的? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这个问题是我在学习理解printf的时候第一个思考的问题,即格式符是如何什么时候被解析的,答案有两种,对应了两种不同的结果。

    首先是在编译阶段被解析,这种方式的话也有两种情况,一是编译器有针对printf这类函数的优化,二是编译器会主动把字符串中的格式符变成某种执行效果。而另一种方案是printf函数内部实现的解析格式符。

    我们可以用如下的程序来测试(为了方便,后面我们生成程序的名称都为demo.exe):

    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
        int a = 1, b = 2;
        char* str = "a=%d\n";
        printf(str, a);
        printf(argv[1], b);
        putchar('\n');
        return 0;
    }
    

    然后我们把它们编译完成后,在命令行中使用./demo.exe b=%d来运行(如果使用的某种IDE,可以打开工程文件夹,找到输出exe文件,然后在文件夹中按住shift+右键,打开powershell,然后用./文件名.exe b=%d的方式运行即可)。

    最后我们会得到两行输出a=1b=2

    对于上面的程序,我们来理解一下:

    其中首先是main函数的部分,可以发现我们在里面写了两个参数,其实这种写法才是C语言main函数的标准写法,具体可以参考我之前写的《C的main函数解析》这篇博客,这里不作详述,这里只说一下其中第八行的argv[1]其实就代表了我们开启程序时输入的第一个参数字符串,在我们的示例里面也就是b=%d一句。那么我们从第一个输出a=1可以看出,这里的输出语句并不是直接写在printf函数里的,但是占位符仍然有效,而第二个b=2则表明了我们通过外部未知的字符串中的占位符也实现了占位符效果。故可知占位符实际上是在printf中被解析的。

    既然知道了这个,那么printf解析的方案其实也就很容易出来了,程序通过检测百分号%寻找占位符,并根据不同的占位符将数字转换成字符串。