| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1256 人关注过本帖
标题:这个程序中的若干错误和警告 该怎么改? P:虽有编译器提示 但我还是无能 ...
只看楼主 加入收藏
houmin0036
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2013-1-15
结帖率:37.5%
收藏
 问题点数:0 回复次数:3 
这个程序中的若干错误和警告 该怎么改? P:虽有编译器提示 但我还是无能为力
//多表代换加密.
#include <stdio.h>
#include <string.h>
#define lETTERS_NUMBER 26

char table[26][26]; //全局变量

void main ()
{
char multi_table (char ); //制表的函数
char enter_plaintext_key_word (char , char ); //输入明文、密钥词的函数.
char indentation_plaintext (char ); //缩进__删除明文中的所有空格,使明文变成一连串的字符的函数.
char repeat_key_word (char , char ); //重复密钥词的函数.
char encrypt (char , char , char , char ); //加密的函数.
char export_ciphertext (char ); //输出密文的函数.

multi_table (table[26][26]);
enter_plaintext_key_word (plaintext[50], key_word[20]);
indentation_plaintext (plaintext[50]);
repeat_key_word (key_word[20], key[50]);
encrypt (key[50], plaintext[50], table[26][26], ciphertext[50]);
export_ciphertext (ciphertext[50]);
}

char multi_table (char table[26][26])
{
int i = 0, j = 0;
char z = 'A';

for (i = 0; i < lETTERS_NUMBER; i++)
{
for (j = 0, z = 'A'; j < lETTERS_NUMBER, z <= 'Z'; j++, z++)
{
table[i][j] = (z - 'A' + i) % lETTERS_NUMBER + 'A'; //同凯撒密码移位规律,对各个表中的字母移位进行制表.
}
}

printf ("  注 : 行为明文对应的字母,列为密钥对应的字母\n");
printf ("***************************************Table***********************************\n");
for (i = 0; i < lETTERS_NUMBER; i++)
{
for (j = 0; j < lETTERS_NUMBER; j++)
{
printf ("%3c", table[i][j]);
}
printf ("\n");
}
}

char plaintext[50]; //明文.(局部变量)
char key_word[20];  //密钥词.(局部变量)

char enter_plaintext_key_word (char plaintext[50], char key_word[20])
{
printf ("\n输入一段不超过50个字符(包括空格)的明文\n(字符中字母需小写且字符中不包括标点符号) : \n");
gets (plaintext);

printf ("输入密钥词 (每个字母需小写) : \n");
gets (key_word);
}

char indentation_plaintext (char plaintext[50])
{
int i = 0, j = 0;

while (plaintext[i] != '\0') //进行while中的语句直到plaintext中删除完所有空格.
{
if (plaintext[i] == 32) //32 代表 空格字符的ASCLL码值.
{
for (j = i; plaintext[j] != '\0'; j++)
{
plaintext[j] = plaintext[j+1]; //使空格后的所有字符前移一位.
}
}
i++;
}
}

char key[50]; //密钥.(局部变量)

char repeat_key_word (char plaintext[50], char key_word[20], char key[50])
{
int i = 0;
int plaintext_length =  strlen (plaintext);
int key_word_length = strlen (key_word);

for(i = 0; i < plaintext_length; i++)
{
key[i] = key_word[i % key_word_length]; //运用此规律可将key_word重复和plaintext_length相同的相应字符给key.
}

/* 次效率代码 :
int i = 0;
int repeat_frequency_integer = 0;  //需重复key_word的整数倍.
int repeat_frequency_remainder = 0; //需重复key_word的余数个数.

repeat_frequency_integer = strlen (plaintext) / strlen (key_word);

if (repeat_frequency_integer == 0) //若plaintext是key_word的整数倍,则使用字符串处理函数连接key_word的倍数的次数.
{
for (i = 0; i < repeat_frequency_integer; i++)
{
strcat (key, key_word);
}
}
else //若plaintext非key_word的整数倍,则重复上一个for循环中的语句后加上余出的字符个数对应的key_word的字符.
{
for (i = 0; i < repeat_frequency_integer; i++)
{
strcat (key, key_word);
}

repeat_frequency_remainder = strlen (plaintext) % strlen (key_word);

for (i = 0 ; i < repeat_frequency_remainder; i++)
{
key[strlen (key)] = key_word[i];
}
}
*/
}

char ciphertext[50]; //密文.(局部变量).

char encrypt (char key[50], char plaintext[50], char table[26][26], char ciphertext[50])
{
int i = 0, j = 0;
int z = 0;

int key_length = strlen (key);

for (z = 0; z <  key_length; z++)
{

/*
若key[z]的ASCLL码值为100,其在明文表中的字母序列为第4个即"d";
则key[z+1]的ASCLL码值为101,其在明文表中的字母序列为第5个即"e";
则key[z+2]的ASCLL码值为102,其在明文表中的字母序列为第6个即"f".
因此得规律:
100 - 4 = 96
101 - 5 = 96
102 - 6 = 96
所以将key[z] - 96得key在表中的字母序列号,
又因为变量z的初值为"0",因此需将"key[z] - 96" - 1.
plaintext[z]的规律同key[z].
*/

i =  key[z] - 96 -1;  //计算出key中每个字符对应的下标.
j = plaintext[z] - 96 - 1; //计算出plaintext中每个字符对应的下标.
ciphertext[z] = table[i][j]; //将table中的所对应的每个字母赋予ciphertext.
}
}

char export_ciphertext (char ciphertext[50])
{
printf ("密文 : \n");
puts (ciphertext);
printf ("\n");
}

在错误中有以下三种类别的
错误    18    error C2065: “ciphertext”: 未声明的标识符 c:\users\administrator\documents\visual studio 2010\projects\hou_vs2010\hou_vs2010\min0.c    21

错误    2    error C2109: 下标要求数组或指针类型 c:\users\administrator\documents\visual studio 2010\projects\hou_vs2010\hou_vs2010\min0.c    18

错误    20    error C2198: “encrypt”: 用于调用的参数太少 c:\users\administrator\documents\visual studio 2010\projects\hou_vs2010\hou_vs2010\min0.c    21



在警告中有一种类别的加一个其它的
警告    24    warning C4028: 形参 1 与声明不同 c:\users\administrator\documents\visual studio 2010\projects\hou_vs2010\hou_vs2010\min0.c    26

警告    30    warning C4029: 声明的形参表不同于定义 c:\users\administrator\documents\visual studio 2010\projects\hou_vs2010\hou_vs2010\min0.c    82
搜索更多相关主题的帖子: 函数 include 编译器 
2013-05-16 23:38
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
....先看书,这错误...真心不想改!

仰望星空...........不忘初心!
2013-05-17 10:55
bccn新
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:57
专家分:144
注 册:2013-5-10
收藏
得分:0 
哥们,程序太长了,我没细看,不过粗看之下,我发现你定义的函数的声明的形参和原函数都不匹配。字符和指针怎能匹配呢?

[ 本帖最后由 bccn新 于 2013-5-17 11:16 编辑 ]
2013-05-17 11:13
houmin0036
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2013-1-15
收藏
得分:0 
这次的源码
我改的只有两个警告了  不会改了
图片附件: 游客没有浏览图片的权限,请 登录注册


//多表代换加密.
#include <stdio.h>
#include <string.h>
#define lETTERS_NUMBER 26

char table[26][26]; //全局变量
char plaintext[50]; //明文.
char key_word[20];  //密钥词.
char key[50]; //密钥.
char ciphertext[50]; //密文.

void main ()
{
    char multi_table (char (*)); //制表的函数
    char enter_plaintext_key_word (char *, char *); //输入明文、密钥词的函数.
    char indentation_plaintext (char *); //缩进__删除明文中的所有空格,使明文变成一连串的字符的函数.
    char repeat_key_word (char *, char *, char *); //重复密钥词的函数.
    char encrypt (char *, char *, char (*), char *); //加密的函数.
    void export_ciphertext (char *); //输出密文的函数.

    multi_table (table[26]);
    enter_plaintext_key_word (plaintext, key_word);
    indentation_plaintext (plaintext);
    repeat_key_word (plaintext, key_word, key);
    encrypt (key, plaintext, table[26], ciphertext);
    export_ciphertext (ciphertext);
}

char multi_table (char (*table)[26])
{
    int i = 0, j = 0;
    char z = 'A';

    for (i = 0; i < lETTERS_NUMBER; i++)
    {
        for (j = 0, z = 'A'; j < lETTERS_NUMBER, z <= 'Z'; j++, z++)
        {
            table[i][j] = (z - 'A' + i) % lETTERS_NUMBER + 'A'; //同凯撒密码移位规律,对各个表中的字母移位进行制表.
        }
    }

    printf ("  注 : 行为明文对应的字母,列为密钥对应的字母\n");
    printf ("***************************************Table***********************************\n");
    for (i = 0; i < lETTERS_NUMBER; i++)
    {
        for (j = 0; j < lETTERS_NUMBER; j++)
        {
            printf ("%3c", table[i][j]);
        }
        printf ("\n");
    }
    return (*table[26]);
}



char enter_plaintext_key_word (char *plaintext, char *key_word)
{
    printf ("\n输入一段不超过50个字符(包括空格)的明文\n(字符中字母需小写且字符中不包括标点符号) : \n");
    gets (plaintext);

    printf ("输入密钥词 (每个字母需小写) : \n");
    gets (key_word);

    return (*plaintext, *key_word);
}

char indentation_plaintext (char *plaintext)
{
    int i = 0, j = 0;

    while (plaintext[i] != '\0') //进行while中的语句直到plaintext中删除完所有空格.
    {
        if (plaintext[i] == 32) //32 代表 空格字符的ASCLL码值.
        {
            for (j = i; plaintext[j] != '\0'; j++)
            {
                plaintext[j] = plaintext[j+1]; //使空格后的所有字符前移一位.
            }
        }
        i++;
    }
    return (*plaintext);
}



char repeat_key_word (char *plaintext, char *key_word, char *key)
{
    int i = 0;
    int plaintext_length =  strlen (plaintext);
    int key_word_length = strlen (key_word);

    for(i = 0; i < plaintext_length; i++)
    {
        key[i] = key_word[i % key_word_length]; //运用此规律可将key_word重复和plaintext_length相同的相应字符给key.
    }

    /* 次效率代码 :
    int i = 0;
    int repeat_frequency_integer = 0;  //需重复key_word的整数倍.
    int repeat_frequency_remainder = 0; //需重复key_word的余数个数.

    repeat_frequency_integer = strlen (plaintext) / strlen (key_word);

    if (repeat_frequency_integer == 0) //若plaintext是key_word的整数倍,则使用字符串处理函数连接key_word的倍数的次数.
    {
    for (i = 0; i < repeat_frequency_integer; i++)
    {
    strcat (key, key_word);
    }
    }
    else //若plaintext非key_word的整数倍,则重复上一个for循环中的语句后加上余出的字符个数对应的key_word的字符.
    {
    for (i = 0; i < repeat_frequency_integer; i++)
    {
    strcat (key, key_word);
    }

    repeat_frequency_remainder = strlen (plaintext) % strlen (key_word);

    for (i = 0 ; i < repeat_frequency_remainder; i++)
    {
    key[strlen (key)] = key_word[i];
    }
    }
    */
    return (*plaintext, *key_word, *key);
}



char encrypt (char *key, char *plaintext, char (*table)[26], char *ciphertext)
{
    int i = 0, j = 0;
    int z = 0;

    int key_length = strlen (key);

    for (z = 0; z <  key_length; z++)
    {

        /*
        若key[z]的ASCLL码值为100,其在明文表中的字母序列为第4个即"d";
        则key[z+1]的ASCLL码值为101,其在明文表中的字母序列为第5个即"e";
        则key[z+2]的ASCLL码值为102,其在明文表中的字母序列为第6个即"f".
        因此得规律:
        100 - 4 = 96
        101 - 5 = 96
        102 - 6 = 96
        所以将key[z] - 96得key在表中的字母序列号,
        又因为变量z的初值为"0",因此需将"key[z] - 96" - 1.
        plaintext[z]的规律同key[z].
        */

        i =  key[z] - 96 -1;  //计算出key中每个字符对应的下标.
        j = plaintext[z] - 96 - 1; //计算出plaintext中每个字符对应的下标.
        ciphertext[z] = table[i][j]; //将table中的所对应的每个字母赋予ciphertext.
    }
    return (*key, *plaintext, *table[26], *ciphertext);
}

void export_ciphertext (char *ciphertext)
{
    printf ("密文 : \n");
    puts (ciphertext);
    printf ("\n");
}
2013-05-17 12:14
快速回复:这个程序中的若干错误和警告 该怎么改? P:虽有编译器提示 但我还是 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018488 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved