在C中解密文件的函数?

在C中解密文件的函数?,c,arrays,function,pointers,structure,C,Arrays,Function,Pointers,Structure,我有一个包含大量“潜在客户”的文件,因此每行都有一个加密的姓氏、一个加密的名字、一个12位的id代码,然后是4个评级(3个整数,1个浮点)。加密是用文件中最后一个数字的值(发现为310)移动名称的每个字符 尝试创建一个函数来解密1个字符,然后使用此函数创建另一个函数来解密字符串(名称),但我遇到错误和分段错误,请帮助 #include <stdio.h> #include <stdlib.h> #define MSTRLEN 20 #define MAX_SIZE 10

我有一个包含大量“潜在客户”的文件,因此每行都有一个加密的姓氏、一个加密的名字、一个12位的id代码,然后是4个评级(3个整数,1个浮点)。加密是用文件中最后一个数字的值(发现为310)移动名称的每个字符

尝试创建一个函数来解密1个字符,然后使用此函数创建另一个函数来解密字符串(名称),但我遇到错误和分段错误,请帮助

#include <stdio.h>
#include <stdlib.h>

#define MSTRLEN 20
#define MAX_SIZE 1000

/* structure prototype */
typedef struct {
    char lastname[MSTRLEN];
    char firstname[MSTRLEN];
    char secretcode[13];
    int rank1;
    int rank2;
    float rank3;
    int rank4;
} prospect_t;

int main (void)
{

    FILE *ifile;
    prospect_t *prospects;
    char last[MSTRLEN],first[MSTRLEN],code[13],last_name,first_name;
    int r1,r2,r4,num_prospects,shift,i,j;
    float r3;

    char unencrypt_letter(char *letter, int shift);
    char unencrypt_name(char name[MSTRLEN], int shift);


    /*finding how many prospects and last integer*/
    ifile = fopen("prospects.txt","r");
    num_prospects = 0;

    if (ifile == NULL){ 
        printf("File not found!\n");
        return (-1);
    }
    while (fscanf(ifile,"%s %s %s %d %d %f %d",last,first,code,&r1,&r2,&r3,&r4)!=EOF){
        num_prospects++;
    }
    shift = r4%26;
    fclose(ifile);
    /*--------------------------------------*/

    /* dynamic memory allocation */
    prospects = (prospect_t*)malloc(num_prospects*sizeof(prospect_t));

    ifile = fopen("prospects.txt","r");

    if (ifile == NULL){ 
        printf("File not found!\n");
        return (-1);
    }

    for(i=0;i<num_prospects;i++){
        fscanf(ifile,"%s %s %s %d %d %f %d", prospects[i].lastname,prospects[i].firstname,prospects[i].secretcode,&prospects[i].rank1,&prospects[i].rank2,&prospects[i].rank3,&prospects[i].rank4); 
    }
    /* to be used once get working
    for(j=0;j<num_prospects;j++){
        prospects[j].lastname = unencrypt_name(prospects[j].lastname,shift);
        prospects[j].firstname = unencrypt_name(prospects[j].firstname,shift);
    }
    */
    /* to be taken out once working */
    last_name = unencrypt_name(prospects[0].lastname,shift);
    first_name = unencrypt_name(prospects[0].firstname,shift);

    printf("%s %s\n",last_name,first_name);



    fclose(ifile);      

    free(prospects);
    return(0);
}

/* function to unencrypt one letter */
char unencrypt_letter(char *letter, int shift)
{
char *new_letter;

if ((*letter - shift) < 'a')
    *new_letter = (char)((*letter - shift) + 26);
else
    *new_letter = (char)(*letter - shift);

return(*new_letter);
}
/* function to unencrypt a name */
char unencrypt_name(char name[MSTRLEN],int shift)
{
char new_name[MSTRLEN];
int k;

k = 0;

while (name[k] != '\0'){
    new_name[k] = unencrypt_letter(name[k],shift);
    k++;
}
return(*new_name);
}
#包括
#包括
#定义MSTRLEN 20
#定义最大尺寸1000
/*结构原型*/
类型定义结构{
字符lastname[MSTRLEN];
字符名[MSTRLEN];
字符加密码[13];
int rank1;
int rank2;
浮动等级3;
国际排名4;
}展望;;
内部主(空)
{
文件*ifile;
前景(prospect)前景;;
字符last[MSTRLEN],first[MSTRLEN],代码[13],姓,名;
int r1,r2,r4,num_prospects,shift,i,j;
浮动r3;
字符未加密字母(字符*字母,整数移位);
char unencrypt_name(char name[MSTRLEN],int-shift);
/*查找有多少潜在客户和最后一个整数*/
ifile=fopen(“prospects.txt”、“r”);
num_prospects=0;
如果(ifile==NULL){
printf(“未找到文件!\n”);
返回(-1);
}
while(fscanf(如果文件为“%s%s%s%d%d%f%d”,最后一个、第一个、代码、&r1、&r2、&r3、&r4)!=EOF){
num_prospects++;
}
班次=r4%26;
fclose(ifile);
/*--------------------------------------*/
/*动态内存分配*/
prospects=(prospect_t*)malloc(num_prospects*sizeof(prospect_t));
ifile=fopen(“prospects.txt”、“r”);
如果(ifile==NULL){
printf(“未找到文件!\n”);
返回(-1);
}

对于(i=0;i再次阅读警告,它们非常清楚:

la2.c:68:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ la2.c:68:2:警告:格式“%s”要求参数类型为“char*”,但参数2的类型为“int” 它告诉您第68行的
printf
调用的第二个参数应该是一个字符串(
char*
),但您传递了一个整数(实际上是一个
char
,但编译器将其转换为
int
)作为该参数


稍后,当您运行程序时,
printf
将该整数用作指向字符串的指针,由于该整数不是正确的整数,程序将崩溃。

再次阅读警告,它们非常清楚:

la2.c:68:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ la2.c:68:2:警告:格式“%s”要求参数类型为“char*”,但参数2的类型为“int” 它告诉您第68行的
printf
调用的第二个参数应该是一个字符串(
char*
),但您传递了一个整数(实际上是一个
char
,但编译器将其转换为
int
)作为该参数


稍后,当您运行程序时,
printf
使用该整数作为字符串指针,由于该整数不是正确的整数,程序崩溃。

假设第二个
fscanf
是第68行

fscanf(ifile,"%s %s %s %d %d %f %d", prospects[i].lastname,prospects[i].firstname,prospects[i].secretcode,&prospects[i].rank1,&prospects[i].rank2,&prospects[i].rank3,&prospects[i].rank4); 
我会在里面放一些
()
,以确保你得到你所想的地址

&(prospects[i].lastname), ...
在调用它之前,您不会预先声明
char unencrypt_letter(char*letter,int-shift)
,因此编译器假定它返回一个int


假设第二个
fscanf
是第68行,则在
main()

之前添加它的预声明

fscanf(ifile,"%s %s %s %d %d %f %d", prospects[i].lastname,prospects[i].firstname,prospects[i].secretcode,&prospects[i].rank1,&prospects[i].rank2,&prospects[i].rank3,&prospects[i].rank4); 
我会在里面放一些
()
,以确保你得到你所想的地址

&(prospects[i].lastname), ...
在调用它之前,您不会预先声明
char unencrypt_letter(char*letter,int-shift)
,因此编译器假定它返回一个int

main()