I have finally finished writing my code for the Substitution question in Problem Set 2, but Check50 tells me that my code has a segmentation fault when there is a lack of key. My code is as follows:
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, string argv[])
{
int n = strlen(argv[1]);
if (argc == 2 && n == 26)
{
for (int i = 0; i < n; i++)
{
if (!(isalpha(argv[1][i])))
{
printf("Please enter a valid substitution key in the command-line. Your key must contain each and every letter of the alphabet only once in no particular order, but nothing more.\n");
return 1;
}
else
{
for (int j = 0; j < n; j++)
{
if (i != j && argv[1][i] == argv[1][j])
{
printf("Please enter a valid substitution key in the command-line. Your key must contain each and every letter of the alphabet only once in no particular order, but nothing more.\n");
return 1;
}
}
}
}
}
else
{
printf("Please enter a valid substitution key in the command-line. Your key must contain each and every letter of the alphabet only once in no particular order, but nothing more.\n");
return 1;
}
string ptext = get_string("plaintext: ");
printf("ciphertext: ");
for (int k = 0, o = strlen(ptext); k < o; k++)
{
if (islower(ptext[k]))
{
printf("%c", tolower(argv[1][ptext[k] - 'a']));
}
else if (isupper(ptext[k]))
{
printf("%c", toupper(argv[1][ptext[k] - 'A']));
}
else
{
printf("%c", ptext[k]);
}
}
printf("\n");
return 0;
}
Indeed, when I try to execute my program without a key, it does result in a segmentation fault, as shown here:
~/pset1/substitution/ $ make substitution
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow substitution.c -lcrypt -lcs50 -lm -o substitution
~/pset1/substitution/ $ ./substitution
Segmentation fault
I thought that
else
{
printf("Please enter a valid substitution key in the command-line. Your key must contain each and every letter of the alphabet only once in no particular order, but nothing more.\n");
return 1;
}
would have already considered the case when arcc == 1, that is, when there is no key? Any intuitions and reasons as to why my code has a segmentation fault and where that fault might lie would be greatly appreciated :)