コードを実行してオプション2または3を選択すると、文字列を入力した後にセグメント化エラーが発生し、エラーの原因が表示されません。私は何かが私の暗号化機能と復号化機能を持っていると仮定していますが、私は何がわかりません。セグメンテーションフォルトエラーの原因
#include <stdio.h>
#include <string.h>
#define SIZE 500
int getUserChoice()
{
int decision = 0;
printf("-------------------------------\n");
printf("| 1) Change Shift (default 3) |\n");
printf("| 2) Encrypt a message |\n");
printf("| 3) Decrypt a message |\n");
printf("| 4) Quit |\n");
printf("-------------------------------\n");
printf("Option: ");
scanf("%d", &decision);
if(decision <= 0 || decision >= 4)
{
return 0;
}
return decision;
}
int getShift()
{
int key = 3;
printf("Enter new shift value: ");
scanf("%d", &key);
return key;
}
void getString(char buf[])
{
char c = 0;
int i = 0;
while((c = getchar()) != '\n' && c != EOF){
}
printf("Input: ");
fgets(buf, SIZE, stdin);
printf("Output: %s\n", buf[i]);
}
void encrypt(char buf[], int shift)
{
int i;
for(i = 0; i < (strlen(buf-1));++i)
{
buf[i] = buf[i] + shift;
}
}
void decrypt(char buf[], int shift)
{
int i;
for(i = 0; i < (strlen(buf-1)); ++i)
{
buf[i] = buf[i] - shift;
}
}
int main()
{
char userStr[SIZE];
int shift = 3;
int number;
while(1)
{
number = getUserChoice();
if(number == 1)
{
shift = getShift();
}
if (number == 2)
{
getString(userStr);
encrypt(userStr, shift);
}
if (number == 3)
{
getString(userStr);
decrypt(userStr, shift);
}
if (number == 0)
{
break;
}
}
return 0;
}
なぜあなたはbuf' 'から '1'減算されていますか?これはバッファの外側にアクセスします。これは未定義の動作です。 – Barmar
私はそれがちょうどタイプミスで、あなたが 'for(i = 0; i <(strlen(buf)-1); ++ i) strlen(buf); ++ i) ' – Anty
文字列を暗号化して解読するときに、改行文字やヌル文字も暗号化して解読したくありません。 – Boo92