×
Featured image of post 换个姿势学C语言第5章5.4

换个姿势学C语言第5章5.4

换个姿势学C语言 第5章 获取完整的牌价数据 5.4节 获取和显示货币名称

0. 说明

《换个姿势学C语言》由何旭辉 著,清华大学出版社2022年出版。感谢何老师!

Snipaste_2024-03-10_14-51-10.png

这是一本非常不错的书!

5. 获取完整的牌价数据

5.4 获取和显示货币名称

在5.1.2节中,我们已经可以使用一个双精度浮点型数组存储现汇买入价、现钞买入价、现汇卖出价、现钞卖出价和中行折算价。

Snipaste_2024-03-10_00-12-26.png

BOCRates.h头文件中定义了函数GetRatesAndCurrencyNameByCode

1
int GetRatesAndCurrencyNameByCode(const char* code, char* name, char* publishTime, double* rates);

该函数不仅会返回货币名称,还会顺便返回牌价的发布时间。

在中行外汇网站上面可以看到,有多种货币:

货币名称现汇买入价现钞买入价现汇卖出价现钞卖出价中行折算价发布日期发布时间长度
港币88.188.188.4688.4688.252026/3/710:30:002
卢布8.418.418.848.848.782026/3/710:30:002
美元689.4689.4692.3692.3690.252026/3/710:30:002
欧元797.99797.99803.83803.83801.322026/3/710:30:002
日元4.35774.35774.39144.39144.38142026/3/710:30:002
英镑921.13921.13927.98927.98921.982026/3/710:30:002
澳门元85.5485.5485.9385.9385.642026/3/710:30:003
韩国元0.46160.46160.47130.47130.46622026/3/710:30:003
林吉特174.39175.96174.992026/3/710:30:003
泰国铢21.6221.6221.821.821.752026/3/710:30:003
文莱元496.64583.02540.522026/3/710:30:003
新台币20.7822.7721.752026/3/710:30:003
越南盾0.0250.02760.02642026/3/710:30:003
丹麦克朗106.78106.78107.64107.64107.252026/3/710:30:004
加拿大元506.49506.49510.47510.47504.942026/3/710:30:004
捷克克朗29.2136.4332.942026/3/710:30:004
南非兰特41.3841.3841.8641.8641.442026/3/710:30:004
挪威克朗71.6471.6472.2272.2271.342026/3/710:30:004
瑞典克朗74.8474.8475.4475.4474.832026/3/710:30:004
瑞士法郎885.06885.06891.9891.9884.142026/3/710:30:004
新加坡元537.89537.89541.94541.94539.072026/3/710:30:004
新西兰元405.92405.92408.98408.98407.212026/3/710:30:004
印度卢比7.12017.93887.54222026/3/710:30:004
印尼卢比0.04030.04030.04130.04130.0412026/3/710:30:004
澳大利亚元483.07483.07486.91486.91484.152026/3/710:30:005
巴西雷亚尔124.78139.08131.322026/3/710:30:005
菲律宾比索11.5711.5711.8111.8111.752026/3/710:30:005
柬埔寨瑞尔0.1530.19130.17252026/3/710:30:005
墨西哥比索38.3738.3739.1539.1538.992026/3/710:30:005
尼泊尔卢比3.84875.47114.7292026/3/710:30:005
沙特里亚尔182.7182.7185.28185.28183.922026/3/710:30:005
土耳其里拉14.5714.5716.7716.7715.672026/3/710:30:005
匈牙利福林2.01912.01912.05992.05992.06722026/3/710:30:005
阿联酋迪拉姆186.68186.68189.32189.32187.952026/3/710:30:006
巴基斯坦卢比2.0272.9172.47482026/3/710:30:006
卡塔尔里亚尔168.49210.15189.542026/3/710:30:006
科威特第纳尔2007.152503.312257.772026/3/710:30:006
蒙古图格里克0.180.180.2070.2070.19382026/3/710:30:006
以色列谢克尔201.29246.02223.82026/3/710:30:006
塞尔维亚第纳尔6.75346.88986.83742026/3/710:30:007

最长的化名名称是“塞尔维亚第纳尔”,有7个汉字。书上之前编写的时候,最长的货币名称是“阿联酋迪拉姆”,一共6个汉字,一个汉字需要2字节,6个汉字就需要12个字节来存储,加上字符串终止符,一共需要13个字节来存储。也就是说定义一个13字节的字符数组就可以存储任意一个货币名称。如果仅定义13字节的字符数组,现在最长的“塞尔维亚第纳尔”就存储不进去了!!!

  • 为数据准备内存空间时不要过于节约,还需要考虑客户需求未来有发生变化的可能。虽然国际货币种类发生变化的概率不是很大,但这种可能性仍然存在,所以将数据定义得大一些,以浪费一些内存空间来应对可能的变化是一个好做法。

基于以上考虑,定义了以下数组用于存储货币名称:

1
2
// 货币名称
char currencyName[33] = { 0 };

这个数组最多可以存储16个汉字和1个字符串终止符。

GetRatesAndCurrencyNameByCode函数返回的发布时间的格式是这样的:

1
2021-06-12 10:30:00

一共有19个字符(空格也算一个字符),加上字符串终止符,需要20个字节来存储。

创建代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// L05_19_GET_RATES_AND_CURRENCY_NAME_BY_CODE.cpp
#include "D:/BC101/Libraries/BOCRates/BOCRates.h"
#include <stdio.h>
#pragma comment(lib, "D:/BC101/Libraries/BOCRates/BOCRates.lib")

int main()
{
    // 存储货币的五种价格
    double rates[5] = { 0 };
    // 货币名称
    char currencyName[33] = { 0 };
    // 发布时间
    char publishTime[20] = { 0 };
    int result = GetRatesAndCurrencyNameByCode("USD", currencyName, publishTime, rates);
    printf("%d\n", result);
    if (result == 1) {
        printf("货币名称:%s\n", currencyName);
        printf("发布时间:%s\n", publishTime);
        printf("现汇买入价:%.2f\n", rates[0]);
        printf("现钞买入价:%.2f\n", rates[1]);
        printf("现汇卖出价:%.2f\n", rates[2]);
        printf("现钞卖出价:%.2f\n", rates[3]);
        printf("中行折算价:%.2f\n", rates[4]);
    }
    else {
        printf("网络或服务器异常\n");
    }

    return 0;
}

运行工程,显示如下:

Snipaste_2026-03-02_23-43-27.png

到此,我们已经可以完整地获得某种货币的全部牌价信息,并将获得的牌价、货币名称和发布时间存储在三个数组 中。

后面需要看如何获取所有货币代码,以及如何展示。