c - Got stuck in the final part of a program for encryption in Vigenere -
i attending online course cs50 on edx , have assignment in have create program user enters keyword ( used encryption ) , string needs encrypted in vigenere cipher.
vigenere works encrypting text following keyword: example if string "hello" , keyword "abc" : a
equal 0 in alphabetical characters, b
1, , c
2; letter h
in string encrypted without switching characters ( s letter a
in keyword = 0), letter e
switched 1 position , encrypted f
, , on. if keyword has length less of string (like in case) encryption has use again first character of keyword , problem.
in fact, think implemented whole program not sure how take consideration if keyword has less characters string entered. program returning first char of string encrypted , first char not encrypted , stops.
i not ask complete solution, want understand how can solve program problem.
here program:
#include <stdio.h> #include <cs50.h> #include <ctype.h> #include <stdlib.h> #include <string.h> int vigenere_low( char c ) { int v = c - 'a'; return v; } int vigenere_up( char c ) { int v = c - 'a'; return v; } int keyword_low( char c ) { int k = c - 'a'; return k; } int keyword_up( char c ) { int k = c - 'a'; return k; } int main( int argc, string argv[] ) { string p; string keyword = argv[1]; if ( argc != 2 ) { printf("usage: ./vigenere keyword\n"); return 1; } ( int = 0, n = strlen(keyword); < n; i++ ) { if ( !isalpha( keyword[i]) ) { printf("usage: ./vigenere keyword(alphabetical) \n"); return 1; } } p = getstring(); int j = 0; ( int = 0, n = strlen( p ); < n; i++ ) { if ( isalpha( p[i]) ) { if ( islower( p[i]) ) { if ( islower( keyword[j]) ) { int = (( vigenere_low( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'a'; printf("%c", a); j++; } else { int = (( vigenere_low( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'a'; printf("%c", a);; j++; } } if ( isupper( p[i]) ) { if ( islower( keyword[j]) ) { int = (( vigenere_up( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'a'; printf("%c", a); j++; } else { int = (( vigenere_up( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'a'; printf("%c", a); j++; } } else { printf("%c", p[i] ); } } return 0; } }
... not sure how take consideration if keyword has less characters string entered.
accessing keyword[j]
beyond end of keyword[]
bad. (undefined behavior). happens op's code when key shorter alpha part of message.
simply re-use keyword[]
string needed. hint: reset j
.
mouse on answer.
int j_length = strlen(keyword);
...
j++;
if (j >= j_length) j = 0;
Comments
Post a Comment