鱼C论坛

 找回密码
 立即注册
查看: 2476|回复: 1

写那个vigener密码时遇到点问题

[复制链接]
发表于 2018-10-2 13:38:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chinggggg 于 2018-10-2 13:39 编辑

$]FW5UW$E7]9EQ@`QQF`}NU.png

生成随机密码和输入都正常,然而输出不了加密的文本。。
主要问题应该在password这个函数。。
#include <stdio.h>
#include <stdlib.h>
#define letternum 26
typedef char Elemtype;

//字母结点
typedef struct Letter
{
    Elemtype let;
    struct Letter *next;
} letter;
//数字密码结点
typedef struct Passwords
{
    int passw;
    struct passwords *next;
} pw;

//初始化26个字母,循环链表
void Init(letter **L)
{
    int i;
    *L = (letter*)malloc(sizeof(letter));
    letter *p = *L;
    p->let = 65;
    letter *q;
    for(i = 2; i <= letternum; ++i)
    {
        q = (letter*)malloc(sizeof(letter));
        q->let = i+64;
        p->next = q;
        p = q;
    }
    p->next = *L;
}

//创建密码,根据输入的字符长度,一个字符对应一个100以内的数字
void random(pw **L,int n)
{
    pw *p,*q;
    int i;
    srand(time(0));
    *L = (pw*)malloc(sizeof(pw));
    p = *L;
    p->passw = rand()%100 + 1;
    p->next = NULL;
    for(i = 1; i < n; ++i)
    {
        q = (pw*)malloc(sizeof(pw));
        q->passw = rand()%100 +1;
        p->next = q;
        p = q;
    }
    p->next = NULL;
}

//加密文本
void password(letter *L,pw *P,char *head)
{
    int i;
    pw *a = P;
    letter *x = L;

    while((*head)!= '\n')                                  //检测是否输入回车
    {
        if((*head)!= ' ')                                          //检测是否空格(假定输入的只有空格与字母,不考虑其他符号)
        {
            while((x->let)!= (*head))                  //在创建的字母循环链表中找到对应的字母
            {
                x = x->next;
            }
            for(i = 1;i <= (a->passw)%26;++i)          //根据对应密码找到明文字母的加密字母
            {
                x = x->next;
            }
            printf("%c",x->let);                          //输出加密字母
        }
        else if((*head)== ' ')                                  //假如是空格则直接输出空格
            printf(" ");
        ++head;
        a = a->next;
    }
}

//输出每个密码
void print(pw *L,int n)
{
    int i;
    pw *p = L;
    for(i = 0; i < n; ++i)
    {
        printf("%d ",p->passw);
        p = p->next;
    }
    printf("\n");

}

int main()
{
    int n,i;
    pw *p = NULL;
    char plain[50];
    letter *L = NULL;
    Init(&L);

    printf("输入字母:");
    gets(plain);

    i = strlen(plain);                                           //输入明文的长度

    random(&p,i);                                          //创造出对应的密码
    print(p,i);                                                  //打印出密码
    password(L,p,&plain);                                  //打印加密文本
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-2 14:10:18 | 显示全部楼层
1>main.c
1>c:\visualstudioprojects\c\c\main.c(42): warning C4013: “time”未定义;假设外部返回 int
1>c:\visualstudioprojects\c\c\main.c(51): warning C4133: “=”: 从“pw *”到“passwords *”的类型不兼容
1>c:\visualstudioprojects\c\c\main.c(81): warning C4133: “=”: 从“passwords *”到“pw *”的类型不兼容
1>c:\visualstudioprojects\c\c\main.c(93): warning C4133: “=”: 从“passwords *”到“pw *”的类型不兼容
1>c:\visualstudioprojects\c\c\main.c(108): warning C4013: “gets”未定义;假设外部返回 int
1>c:\visualstudioprojects\c\c\main.c(110): warning C4013: “strlen”未定义;假设外部返回 int
1>c:\visualstudioprojects\c\c\main.c(114): warning C4047: “函数”:“char *”与“char (*)[50]”的间接级别不同
1>c:\visualstudioprojects\c\c\main.c(114): warning C4024: “password”: 形参和实参 3 的类型不同
1>c:\visualstudioprojects\c\c\main.c(101): warning C4101: “n”: 未引用的局部变量
1>C.vcxproj -> C:\VisualStudioProjects\C\Debug\C.exe
1>已完成生成项目“C.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表