1

私は多数の「見込み客」を含むファイルを持っているので、各行には暗号化された姓、暗号化された名、12 桁の ID コード、そして 4 つの評価 (3 つの int、1 つの float) があります。暗号化により、名前のすべての文字が、ファイル内の最後の数字の値 (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);
}

ターミナルから、次の情報を取得しています。

la2.c: 関数 'main' 内:
la2.c:68:2: 警告: フォーマット '%s' は 'char *' 型の引数を想定していますが、引数 2 の型は 'int' です [-Wformat]
la2.c:68:2: 警告: フォーマット '%s' は 'char *' 型の引数を想定していますが、引数 3 の型は 'int' です [-Wformat]
la2.c: 関数 'unencrypt_name' 内:
la2.c:99:3: 警告: 'unencrypt_letter' の引数 1 を渡すと、キャストなしで整数からポインターが作成されます [デフォルトで有効]
la2.c:79:6: 注: 'char *' が必要ですが、引数の型は 'char' です

** リンクフェーズ gcc -o la2 la2.o

コンパイルとリンクが正常に完了しました 次のように入力してバイナリを実行できます: la2 engs20-1:~/engs20/workspace$ la2 セグメンテーション違反

4

2 に答える 2

1

警告をもう一度読んでください。非常に明確です。

la2.c:68:2: 警告: フォーマット '%s' は 'char *' 型の引数を想定していますが、引数 2 の型は 'int' です

68 行目の呼び出しの 2 番目の引数printfは文字列 ( ) であると予想されますが、代わりchar *に整数 (実際には単一charの ですが、コンパイラはそれを にキャストします) を渡しているintことがわかります。

後でプログラムを実行するprintfと、その整数が文字列へのポインターとして使用され、その整数が適切な整数ではないため、プログラムがクラッシュします。

于 2012-10-22T06:16:11.270 に答える
0

fscanf2番目が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 を返すと想定します。

の前にそれの事前宣言を追加しmain()ます。

于 2012-10-22T06:16:46.807 に答える