使用keytool自签证书出现“keytool 错误: java.io.FileNotFoundException: com.example.app.key (拒绝访问。)”,很有可能是所在磁盘为系统盘拒绝写入,可以考虑使用管理员运行CMD然后再次尝试以下命令即可。

C:\Program Files\Java\jdk-17.0.2\bin>keytool.exe -genkey -alias aliasname -keyalg RSA -keysize 2048 -validity 3650 -keystore com.example.app.key

如果不缓存 access_token 应用很容易超出每天 2000 次的请求上限。
set 方法中的 ttl 可按实际需求就行调整,下面的代码中默认设置为 3600 秒。

from django.core.cache import cache
from wechatpy.session import SessionStorage


class DjangoDefaultStorage(SessionStorage):
    """
    使用django默认的缓存方法缓存请求微信接口的access_token
    wechatpy: https://docs.wechatpy.org/zh_CN/stable/quickstart.html#accesstoken
    微信官方:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
    """
    def __init__(self, *args, **kwargs):
        pass

    def get(self, key, default=None):
        return cache.get(key, default)

    def set(self, key, value, ttl=3600):
        cache.set(key, value, ttl)

    def delete(self, key):
        cache.delete(key)

编写以上方法后,在调用的代码部分使用以下方式调用:

session_interface = DjangoDefaultStorage()
client = WeChatClient(WECHAT_APP_ID, WECHAT_APP_SECRET, session=session_interface)

location / {
index index.html index.htm index.php;
sub_filter '</head>' '</head> <p>sth here</p>';
sub_filter_once on;
}

5.1编写一个程序,将从键盘输入的n个字符串保存在一个一维数组A中。在输入字符串之前,先输入n的值。要求,数组A需要动态申请空间,程序运行结束前再释放掉。

#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    string *A = new string[n];
    for (int i = 0; i < n; ++i) {
        cin >> A[i];
    }
    delete []A;

}

本题目主要考察使用new动态申请内存,以及使用 delete[] 释放数组内存。

5.2 在题目1的基础上,输出n个字符中最长的和最短的串,计算n个串的平均长度并输出结果。

#include <iostream>

using namespace std;

int main() {

    int n, sum = 0;
    int lIndex = 0, sIndex = 0;
    double avg;
    cin >> n;
    string *A = new string[n];
    for (int i = 0; i < n; i++) {
        cin >> A[i];
        if (A[i].length() > A[lIndex].length()) lIndex = i; // 记录最长的字符串的索引
        if (A[i].length() < A[sIndex].length()) sIndex = i; // 记录最短的字符串的索引
        sum = sum + A[i].length();
    }
    avg = sum / (double) n;
    cout << avg << endl;
    cout << A[lIndex] << endl;
    cout << A[sIndex] << endl;
    delete []A;

}

解题思路:声明字符串长度的和sum,最长字符串的索引lIndex及最短字符串的索引sIndex,并设其值均为0(即初始化为第一个字符串为最长和最短的字符串),然后在读入字符串的过程中求和,及比较字符串的长度记录最长及最短字符串的索引。

声明:以上答案是本人自己做的解答,不保证答案的正确性和完整性,内容仅供学习交流参考。

C程序设计语言第一章练习题1-16

练习1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本。

#include <stdio.h>
#define MAX_LINE    10


int getline(char[], int);
void copy(char to[], const char from[]);

int main() {

    int len;
    int max;
    char line[MAX_LINE];
    char longest[MAX_LINE];

    max = 0;
    while ((len = getline(line, MAX_LINE)) > 0) {
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    }
    if (max > 0) {
        printf("%s", longest);
    }
}

int getline(char s[], int len) {

    int c, i;
    // 直接将行中的字符复制到字符数组s中
    for (i = 0;; ++i) {
        c = getchar();
        if (c == EOF || c == '\n') break; // 当前行少于 len
        if (i < len - 1) s[i] = (char) c;  // 当前行超出 len
    }
    if (i > len - 1)
        s[len - 1] = '\0'; // 如果行的长度大于 len 在s结尾处写入 \0
    else
        s[i] = '\0'; // 如果行长度小于 len,在长度i的位置写入 \0
//    s[(i > len - 1) ? (len - 1) : i] = '\0'; // 以上 if else 使用三元运算符的简写形式
    return i;
}


void copy(char to[], const char from[]) {
    for (int j = 0;; ++j) {
        to[j] = from[j];
        if (from[j] == '\0') break;
    }
}

解题思路参考:https://www.cnblogs.com/DeadGardens/p/4781076.html