#include<stdio.h>
int main(void) {
int ten = 10;
printf("%d %d %d\n", ten);
return 0;
}
为什么打印出来的第二个数字每次都是随机数,而第三个数字是固定的1
你的printf 只有传了一个参数,其他两个参数未定义,输出的值取决于你的计算机的内存数据,不具有普适性
因为缺少第二个和第三个参数, 会读取内存中的垃圾值来填充这两个位置,导致第二个数字为随机数。而第三个数字 1 是由于C语言在调用函数时使用栈来传递参数,栈的布局使得不同的编译器可能对未初始化的栈部分进行清零操作,因此第三个数字常常是0或者固定的某个值
这样写,printf()函数输出属于未定义行为,输出的值是什么与他无关。
不知道你这个问题是否已经解决, 如果还没有解决的话:是通过控制台的转义序列来实现的,这是文本模式下的系统显示功能,似乎和语言没有太大联系。转义序列是以ESC
开始的,即\033
,ESC
的十进制是27,转为八进制就是33了。
通用格式大致为ESC[{attr1};{attr2};…;{attrn}m
,其中attr表示的是属性,也是属性值,通常直接就是数字表示了。在此我们进行三个常用属性的设置,主要是显示方式、字体颜色和背景色。
显示方式
字体颜色
背景色
大致使用的示例代码如下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函数用于将文本输出到屏幕上或文件中。当我们使用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;
}