c语言printf为什么打印出来是这个结果

#include<stdio.h>
int main(void) {
    int ten = 10;
    printf("%d %d %d\n", ten);
    return 0;
}

为什么打印出来的第二个数字每次都是随机数,而第三个数字是固定的1

img

img

你的printf 只有传了一个参数,其他两个参数未定义,输出的值取决于你的计算机的内存数据,不具有普适性

因为缺少第二个和第三个参数, 会读取内存中的垃圾值来填充这两个位置,导致第二个数字为随机数。而第三个数字 1 是由于C语言在调用函数时使用栈来传递参数,栈的布局使得不同的编译器可能对未初始化的栈部分进行清零操作,因此第三个数字常常是0或者固定的某个值

img

这样写,printf()函数输出属于未定义行为,输出的值是什么与他无关。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7556050
  • 你也可以参考下这篇文章:c语言printf输出的左右对齐问题与字符表示
  • 除此之外, 这篇博客: C语言控制台下printf设置文字颜色和背景色以及实现简单的文字选择菜单中的 printf彩色输出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    是通过控制台的转义序列来实现的,这是文本模式下的系统显示功能,似乎和语言没有太大联系。转义序列是以ESC开始的,即\033ESC的十进制是27,转为八进制就是33了。
    通用格式大致为ESC[{attr1};{attr2};…;{attrn}m,其中attr表示的是属性,也是属性值,通常直接就是数字表示了。在此我们进行三个常用属性的设置,主要是显示方式、字体颜色和背景色。
    显示方式

    • 0(默认值)
    • 1(高亮显示,顺便加粗?不确定)
    • 2(暗淡)
    • 22(非粗体,不确定)
    • 4(下划线)
    • 5(闪烁,但是我没看出有什么效果。。)
    • 25(非闪烁)
    • 7(反显,我也没看出效果)
    • 27(非反显)
    • 8(隐藏)

    字体颜色

    • 30(黑色)
    • 31(红色)
    • 32(绿色)
    • 33(黄色)
    • 34(蓝色)
    • 35(品红)
    • 36(青色)
    • 37(白色)

    背景色

    • 40(黑色)
    • 41(红色)
    • 42(绿色)
    • 43(黄色)
    • 44(蓝色)
    • 45(品红)
    • 46(青色)
    • 47(白色)

    大致使用的示例代码如下
    printf("\033[4;31;42m 输出红色绿背景下划线字符 \033[0m");
    在这里插入图片描述
    这里我写了个函数可以直接拿来用,我写的比较啰嗦,你可以去把它优化一下,后面两个设置为NoneType的话就是默认显示方式而且结尾没有换行符或者回车。

    #define HighLight 1
    #define Underline 4
    #define Spark 5
    #define Contrary 7
    #define Miss 8
    #define NONETYPE 0
    #define PTab 11
    #define PEnter 12
    ...
    void print(char *Message, char *ForeColor, char *BackgroundColor, int flag,int End) {
    	//参数分别为输出的信息,字体颜色,背景色,显示方式和结尾标志
    	char ColorArray[8][10] = { "black","red","green","yellow","blue","purple","deepgreen","white" };
    	int ForeNum, BackgroundNum;
    	for (int i = 0; i < 8; i++) {
    		if (strcmp(ColorArray[i], ForeColor) == 0)
    			ForeNum = i;
    		else if (strcmp(ColorArray[i], BackgroundColor) == 0)
    			BackgroundNum = i;
    	}
    	if (End == NONETYPE) {
    		if (flag==NONETYPE)
    			printf("\033[%d;%dm%s\033[0m",40+BackgroundNum,30+ForeNum,Message);
    		else
    			printf("\033[%dm\033[%d;%dm%s\033[0m",flag, 40 + BackgroundNum, 30 + ForeNum,Message);
    	}
    	else if (End == PTab) {
    		if (flag == NONETYPE)
    			printf("\033[%d;%dm%s\033[0m\t", 40 + BackgroundNum, 30 + ForeNum, Message);
    		else
    			printf("\033[%dm\033[%d;%dm%s\033[0m\t", flag, 40 + BackgroundNum, 30 + ForeNum,Message);
    	}
    	else if (End == PEnter) {
    		if (flag == NONETYPE)
    			printf("\033[%d;%dm%s\033[0m\n", 40 + BackgroundNum, 30 + ForeNum, Message);
    		else
    			printf("\033[%dm\033[%d;%dm%s\033[0m\n", flag, 40 + BackgroundNum, 30 + ForeNum,Message);
    	}
    }
    
  • 您还可以看一下 尹成老师的终极版C语言(四)课程中的 printf井号格式符控制小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    回答:

    在C语言中,printf函数用于将文本输出到屏幕上或文件中。当我们使用printf函数时,会发现在输出的文本中,有些数字可能是随机的,另外第三个数字通常都是1。这是因为printf函数中的格式化字符串控制了输出的格式。

    具体来说,格式化字符串中使用了格式化控制符,用于指定变量的输出格式。格式化控制符以%符号开头,后面跟着一个或多个字符,用于指示输出的变量类型和输出格式。具体的格式化控制符可以参考C语言的文档。

    在默认情况下,printf函数会根据变量类型输出不同格式的数据。例如,%d控制符用于打印有符号的十进制整数,%f控制符用于打印浮点数,%s控制符用于打印字符串等等。

    当我们在使用printf函数输出整型变量时,如果没有指定输出格式,printf函数默认会将变量以十进制整数的形式输出。但是,如果变量的实际类型并不是整型,那么输出的结果就会是随机的。因为在C语言中,变量占用的内存空间按字节来分配,变量的实际值可能会占用多个字节,如果printf函数没有正确地解析变量的类型,则会导致输出结果错误。

    另外,在默认情况下,printf函数会在输出整型变量时,将其右对齐,并在左侧填充空格。为了更好地控制输出格式,可以在格式化字符串中添加一些控制字符,用于指示输出的宽度、精度、对齐方式等。例如,%5d表示输出的整数宽度为5个字符,%02d表示输出整数不足两位时,在左侧补0。

    至于第三个数字永远输出1的问题,这是因为在默认情况下,printf函数会将浮点数四舍五入到小数点后一位。因此,当我们输出一个整数时,实际上它会被当做浮点数来处理,并四舍五入到小数点后一位。

    以下是示例代码,用于输出一个整型变量:

    int num = 123;
    printf("num = %05d\n", num);
    

    输出结果为:num = 00123

    解释:在输出整数前,先输出一个0,再输出123。输出总宽度为5个字符,不足时,在左侧补0。

    综上所述,要控制printf函数的输出,首先需要正确地指定变量类型,其次需要添加适当的控制符,控制输出格式。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

试试


 printf("%d %d %d\n", ten,ten,ten);

2000794464是什么?学号么?这个超过了int的表示范围,而且你要注意,像电话、身份证号、学号、订单号一类的东西,虽然纯数字构成,但是并不会参与四则运算,这种东西,还是应该用字符串表示。

#include<stdio.h>
int main(void) {
    char id[20];
    int ten = 10, i ;
    scanf("%d %s %d", &ten, id, &i);
    printf("%d %s %d\n", ten, id, i);
    return 0;
}