vignere暗号のcでプログラムを書いていましたが、同じ長さのキーを生成する関数で、入力文字列の長さを表示する "printf"行を削除すると、sceenに奇妙なものが表示されますが、GenKey()関数からその "printf"行を削除した場合にのみ発生します。 (その行を削除する前に)C:プログラムがchar関数からprintfを削除した後、出力に奇妙なものを出力する
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *GenKey(char *key, char *source){
int i=0,j=0;
char ReturnKey[strlen(source)];
printf("%d\n",strlen(source)); // THIS LINE HERE CAUSES PROBLEM
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
int main()
{
int i;
char name[10000];
char container[10000];
char VigKey[]="INFERNO";
char *NamePtr;
char *KeyPtr;
printf("give a name: ");
fgets(name,10000,stdin);
char GeneratedKey[strlen(name)];
KeyPtr=VigKey;
NamePtr=name;
strcpy(GeneratedKey,GenKey(KeyPtr,NamePtr));
printf("%s",GeneratedKey);
}
出力:
give a name: ATTACKATDAWN
13
INFERNOINFER
今私は、その行を削除します(その行を削除した後)
char *GenKey(char *key, char *source){
int i=0,j=0;
char ReturnKey[strlen(source)];
// NOW I HAVE DELETED THAT LINE
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
出力:
give a name: ATTACKATDAWN
INFERNOINFERα╫`
あなたはメモリへのポインタを返すしていますすでにリリースされています。関数が返された後、自動ローカル変数はもう存在しません。 – zerkms
コンパイラ警告をオンにします。 –