printf输出不显示

编译器 vs C语言
第一次printf 结果输出但不显示,这是为什么?后面正常输出;

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<stdio.h>


int main1(void)
{
    int input=0;
    char arr[10];
    while (1)
    {
        printf("是否需要检查   是 1   否  0\n");
        scanf("%d", &input);
        if (input == 1)
        {
                printf("请输入想要判断的字符\n");
                scanf("%s", arr);
        }
        else
        {
            break;
        }
    }
    return 0;
}

第6行:int main1(void) ,main() 函数名错误了。

没问题啊(把main1改成main)

img

为什么叫mian1,是不是你的项目里还有别的cpp文件?一个项目只能有一个主程序。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7784405
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:VS中printf参数研究
  • 除此之外, 这篇博客: 有关printf多个输出时的输出问题中的 vs中的printf 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 最近有位兄弟在群里发了这样一个问题

    在这里插入图片描述
    我开始没意识过来,后来自己算了一遍,算出为“3 6”,这问题就有点大了,开始百度吧。
    查了一圈,发现了第一个问题,printf的计算顺序是从右往左的(和栈有关,先入后出),于是再次计算,发现还是不对,第二次算出为“4 2”。所有又是哪里出问题了呢。
    忽然想起,vs有反汇编的功能,那我直接看汇编代码看看问题出在哪
    (vs的编译器是cl,不同编译器将会有不同结果)
    在这里插入图片描述
    嗯,主体部分都在这,我们一条一条看

    	char a = 1;
    004018E8  mov         byte ptr [a],1	 ;把立即数1送到a所指向的地址单元(一个字节),ptr表示指针,也就是给变量a赋值
    	printf("%d %d", a += 2, a *= 2);	 
    004018EC  movsx       eax,byte ptr [a]   ;将变量a的值赋给eax寄存器
    004018F0  shl         eax,1  			 ;eax寄存器左移一位,也就是a*2
    004018F2  mov         byte ptr [a],al  	 ;al表示eax寄存器的低八位,是最低的八位,eax为32位的,这句的意思是把eax的值又赋给a
    004018F5  movsx       ecx,byte ptr [a]   ;a的值赋给ecx寄存器
    004018F9  add         ecx,2  			 ;a+2
    004018FC  mov         byte ptr [a],cl  	 ;a=a+2,给a赋值,这是变量a就是4了,同理cl为ecx的低八位
    004018FF  movsx       edx,byte ptr [a]   ;a的值赋给edx寄存器,为4
    00401903  push        edx  				 ;将edx的内容压栈
    00401904  movsx       eax,byte ptr [a]   
    ;问题出在这句,本来在这句代码之前,eax的内容为2;即第一个算式a*=2的内容;这里重新赋值,导致eax变成了4,下图为单步执行时寄存器值的变化
    00401908  push        eax  				 ;将eax的内容压栈
    	printf("%d %d", a += 2, a *= 2);
    00401909  push        offset string "%d %d" (0407B30h)  
    0040190E  call        _printf (040104Bh)  
    00401913  add         esp,0Ch  
    
    

    在这里插入图片描述
    在这里插入图片描述
    至此,我们可以从汇编代码中可以看出“4 4”结果整个的计算过程

    群里大佬的总结:(对应开始时输出两次变量a的值)
    在这里插入图片描述
    在这里插入图片描述
    最后验证了一下,确实是从右到左算完后,再从左到右输出

    (小弟俺第一次使用vs的反汇编动能,也没接触过cl的汇编程序,如有错误恳请纠正)

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料,可以得出一些结论:

    1. 在使用 printf 函数时,需要引用头文件才能正常使用。
    2. 格式化规定符 %d 表示十进制有符号整数,常用于输出整数。
    3. 在使用 %d 时,可以使用 %-md 控制输出左对齐,%md 指定输出的宽度。
    4. 第一次使用 printf 函数无法正常输出,可能是因为控制台窗口没有刷新。
    5. 可以使用 SetConsoleTitle 函数设置控制台窗口标题,改变窗口标题可以提高程序可读性。
    6. 在 printf 函数中,格式控制符和附加格式控制符的位置顺序为 %附加格式控制符格式控制符。
    7. 使用 %d 输出时,如果数字是负数,则负号也占据一位。
    8. %g 和 %G 输出的是小数和科学计数法中的较短一种情况,只输出六位有效数字。
    9. C 语言中有一些执行顺序的细节问题,比如连加时加号的左结合性会影响运算结果。

    根据以上结论,对于这个问题,可以采取以下措施:

    1. 检查程序是否正确引用了头文件,并且所有编译器相关的设置是否正确。
    2. 在使用 printf 函数输出前,可以加上 fflush(stdout)函数来强制刷新控制台窗口。
    3. 尝试使用 SetConsoleTitle 函数修改控制台窗口标题,提高程序可读性。
    4. 如果仍然无法正常输出,可以尝试使用其他调试方法,比如添加一些输出语句来进行排查。

    代码示例:

    include

    include

    int main() { printf("Hello, world!\n"); fflush(stdout); // 强制刷新控制台输出 // 修改控制台窗口标题 SetConsoleTitle("My Program"); // 后续输出正常 printf("This is my program.\n"); return 0; }