2021-06-11刷题笔记

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来专门表示数据结束么。

猜你喜欢

转载自blog.csdn.net/DerrickWestbrook/article/details/117827278