Difference between revisions of "Practice Everyday"

1,951 bytes added ,  11:19, 26 May 2023
Line 60: Line 60:


</syntaxhighlight>
</syntaxhighlight>
不过,有个小问题,如果是一篇文章,这样从终端输入的方式似乎就不太好,对吧。实用性不高,那读取文件呢?
<syntaxhighlight lang="c" line style="border: 1px dashed red;">
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// encrypt
void encrypt(char *str, int key)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        str[i] += key;
    }
}
// decrypt
void decrypt(char *str, int key)
{
    int len = strlen(str);
    for (int i = 0; i < len; i++)
    {
        str[i] -= key;
    }
}
int main()
{
    char filename[100];
    char buffer[1024];
    int key;
    // OK, read a file, fancy right?
    printf("请输入要读取的文件名:");
    scanf("%s", filename);
    printf("请输入密钥:");
    scanf("%d", &key);
    // let's encrypt what do you want, and, write back result, more fancy, right?
    // Do you want write a user interface: user choose 'encrypt' or 'decrypt'
    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("无法打开文件 %s\n", filename);
        return 1;
    }
    fseek(fp, 0L, SEEK_END); // 定位到文件末尾
    long size = ftell(fp);  // 获取文件大小
    fseek(fp, 0L, SEEK_SET); // 定位到文件开头
    fread(buffer, sizeof(char), size, fp); // 读取整个文件
    fclose(fp);
    // do it!
    encrypt(buffer, key);
    // Done! cool.
    fp = fopen(filename, "a");
    if (fp == NULL)
    {
        printf("无法打开文件 %s\n", filename);
        return 1;
    }
    fprintf(fp, "\n\n加密后的内容:\n%s", buffer);
    fclose(fp);
    printf("加密完成!\n");
    return 0;
}
</syntaxhighlight>
感觉不错。但是是不是可以进一步优化一下下?譬如,写几句,让用户选择是加密还是解密,然后呢,再执行加密或解密的算法?这个小玩具够这个周五的晚上玩儿一阵子的了吧,哈哈哈。


== Day 92 ==
== Day 92 ==