1、
问题描述:
描述
输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。
输入描述:
输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。
输出描述:
三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。
——————————————————————————————————————
我自己是这样写的,比较麻烦
#include <stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
int y = n / 10000;
printf("year=%d\n", y);
int m = n % 10000;
if (m < 1000)
printf("month=0%d\n", m / 100);
else
printf("month=%d\n", m / 100);
int d = n % 100;
if (d < 10)
printf("date=0%d\n", d);
else
printf("date=%d\n", d);
return 0;
}
看了题解才发现可以这样
#include <stdio.h>
int main()
{
int year = 0, month = 0, day = 0;
scanf("%4d%2d%2d", &year, &month, &day);
//使用%0可以填充前导0
printf("year=%d\n", year);
printf("month=%02d\n", month);
printf("date=%02d\n", day);
return 0;
}
原因分析:
考查scanf的输入格式控制与输出,可相见本题的提示。
通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
2、
问题描述:
BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,转换以下ASCII码为对应字符并输出他们。
73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33
——————————————————————————————————————
我用的是循环的方式用%c输出
#include<stdio.h>
int main() {
int a[12] = {
73,32,99,97,110,32,100,111,32,105,116,33 };
for (int i = 0; i < 12; i++)
{
printf("%c", a[i]);
}
printf("\n");
return 0;
}
看了题解才发现可以直接输出,用%s
#include <bits/stdc++.h>
using namespace std;
int main() {
char strings[] = {
73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33};
printf("%s\n",strings);
return 0;
}
原因分析:
字符数组是可以用这种方式输出的,因为数组名即代表首地址,数组是一块连续的内存空间,所以能直接输出.如果是其他类型的数组则输出的是一个地址.
因为C和C++不进行数组的边界检查,数组在内存中存放的只是所有数组元素的值,而不存在一个地方可以表示数组的大小.所以cout函数没法知道该输出多少个元素。
而字符串则不同,它有一个’\0’用来表示字符串结束,cout看到’\0’就知道输出结束了.
可能你想问,为什么别的类型不也弄个类似于’\0’的结束符呢.那我就反问你,你认为哪个值用来做结束符合适?字符串可以用’\0’来表示结束,是因为’\0’这个值就是专门用来表示字符串结束的,对于其他类型,比如整数,你能说用0或-1来专门表示数据结束么。