C语言(CED)从键盘输入一些整数,求出它们的平均值。数据的个数事先不确定,在输入过程中以ctrl+z键(EOF)作为输入结束的标记。

(请先看置顶博文)本博打开方式,请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净

要求:
1、从键盘输入一些整数,求出它们的平均值。数据的个数事先不确定,在输入过程中以ctrl+z键(EOF)作为输入结束的标记。
2、输入一些整数,按回车,然后同时按ctrl键和z键,再按回车结束输入。

本体涉及到 while(scanf("%lf",&a[i])!=EOF)的用法,所以在这里写一点自己的心得体会!

目前接触到的Printf;Scanf()等都是函数,而Scanf()是有返回值的!

 C语言中的程序在运行到“while(scanf("%lf",&a[i])!=EOF)”这一句时,先对a[i]进行赋值,根据赋值情况来得出一个数:因为例子中只对1个值进行赋值,所以赋值成功的话返回值是1,否则是0,返回值即为成功赋值的个数。然后根据这个返回值再来判定while循环语句是否继续进行。大家通过上面的了解之后就会发现,这一语句其实是循环与输入的嵌套语句:其在赋值后,进行循环条件的判断。所以,题目的代码就出来了。

#include<stdio.h>
int main()
{
    double a[1000];
    int i=0;
    double s=0;
    while(scanf("%lf",&a[i])!=EOF)
    i++;
    int m=i;
    for(i=0;i<m;i++)
        s=s+a[i];
        printf("%.2f\n",s/i);
    return 0;
}

以下是基于 OpenSSL 库实现的 SM2 公钥加密算法 C 语言代码,供你参考: ```c #include <openssl/evp.h> #include <openssl/sm2.h> #define PUBKEY "04B8D9B4F5B7ACF0465E7B7A1F3E7C7A8C625A5D57F8B9D6D7E7B3C6EA2E8E7B8D2D0CED0C2BBD5C7B9D9B7A2D3D0C5C0B1A8D3ADA1BAC3CFA1AAE7" #define PLAINTEXT "Hello, world!" int main() { int ret = 0; int ciphertext_len = 0; unsigned char ciphertext[1024] = {0}; unsigned char pubkey[65] = {0}; unsigned char plaintext[1024] = {0}; unsigned char sm2_id[] = "1234567812345678"; EVP_PKEY *pkey = NULL; EVP_PKEY_CTX *pctx = NULL; /* 初始化 OpenSSL 库 */ OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); /* 从字符串中读取公钥 */ int pubkey_len = strlen(PUBKEY) / 2; for (int i = 0; i < pubkey_len; i++) { sscanf(PUBKEY + i * 2, "%2hhx", pubkey + i); } /* 创建 EVP_PKEY 对象 */ pkey = EVP_PKEY_new(); if (!pkey) { printf("EVP_PKEY_new failed\n"); goto done; } /* 设置 EVP_PKEY 对象的算法为 SM2 */ ret = EVP_PKEY_set_type(pkey, EVP_PKEY_EC); if (ret <= 0) { printf("EVP_PKEY_set_type failed\n"); goto done; } /* 从公钥字节数组中创建 EC_KEY 对象 */ EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_sm2); if (!ec_key) { printf("EC_KEY_new_by_curve_name failed\n"); goto done; } /* 从公钥字节数组中设置 EC_KEY 对象的公钥 */ ret = EC_KEY_oct2key(ec_key, pubkey, pubkey_len, NULL); if (ret <= 0) { printf("EC_KEY_oct2key failed\n"); goto done; } /* 将 EC_KEY 对象设置到 EVP_PKEY 对象中 */ ret = EVP_PKEY_set1_EC_KEY(pkey, ec_key); if (ret <= 0) { printf("EVP_PKEY_set1_EC_KEY failed\n"); goto done; } /* 创建 EVP_PKEY_CTX 对象 */ pctx = EVP_PKEY_CTX_new(pkey, NULL); if (!pctx) { printf("EVP_PKEY_CTX_new failed\n"); goto done; } /* 初始化 SM2 公钥加密上下文 */ ret = EVP_PKEY_encrypt_init(pctx); if (ret <= 0) { printf("EVP_PKEY_encrypt_init failed\n"); goto done; } /* 设置 SM2 公钥加密上下文的 ID */ ret = EVP_PKEY_CTX_ctrl_str(pctx, "set1_id", sizeof(sm2_id) - 1, (char *)sm2_id); if (ret <= 0) { printf("EVP_PKEY_CTX_ctrl_str(set1_id) failed\n"); goto done; } /* 公钥加密 */ ret = EVP_PKEY_encrypt(pctx, ciphertext, &ciphertext_len, (const unsigned char *)PLAINTEXT, strlen(PLAINTEXT)); if (ret <= 0) { printf("EVP_PKEY_encrypt failed\n"); goto done; } printf("Ciphertext: "); for (int i = 0; i < ciphertext_len; i++) { printf("%02X", ciphertext[i]); } printf("\n"); done: /* 释放资源 */ if (pctx) { EVP_PKEY_CTX_free(pctx); } if (pkey) { EVP_PKEY_free(pkey); } if (ec_key) { EC_KEY_free(ec_key); } /* 清除 OpenSSL 错误队列 */ ERR_clear_error(); return ret; } ``` 在上述代码中,我们首先从字符串中读取公钥,然后创建 EVP_PKEY 对象,并设置其算法为 SM2。接着,我们从公钥字节数组中创建 EC_KEY 对象,并将其设置到 EVP_PKEY 对象中。最后,我们创建 EVP_PKEY_CTX 对象,初始化 SM2 公钥加密上下文,并进行公钥加密操作。 需要注意的是,在实际使用 SM2 公钥加密算法时,需要针对具体的业务场景进行 ID 的设置,以保证加密结果的安全性。在本例中,我们将 ID 设置为固定值 "1234567812345678",仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liO_Oil

打赏我,开启隐藏模式。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值