0

As the title suggests, I have a "TypeError: not all arguments converted during string formatting" error in vigenere.py for Pset6.

Here's the code:

import cs50
import sys

if len(sys.argv) == 1 or len(sys.argv) > 2:
    print("Usage: python vigenere.py <key>")
    exit(1)

key = sys.argv[1]
for i in range(len(key)):
    if key[i].isalpha() is not True:
        print("Keyword must only contain letters A-Z or a-z")
        exit(2)

print("plaintext: ", end="")
plaintext = cs50.get_string()
plaintext_size = len(plaintext)
key_size = len(key)
ciphertext = []
for i in range(plaintext_size):
    j = 0
    if j >= key_size:
        j = 0
    if plaintext[i].isalpha():
        k = key[j].upper() % 65
        c = plaintext[i] + k
        if ord(plaintext[i].upper()) + k > ord('Z') or ord(plaintext[i].lower() + k > ord('z')):
            c = c - 26
        ciphertext.append(chr(c))
        j = j + 1
    else:
        ciphertext[i] = plaintext[i]

print("ciphertext: ", end="")
print("".join(ciphertext))
exit(0)

Any help would be appreciated. Thanks.

1 Answer 1

0

On this line:

k = key[j].upper() % 65

The % operator in Python does different things depending on whether the left operand is a number or a string. If it's a number, then % does modulo division as in C (with the added feature that Python's modulo also works with floats). If it's a string, however, % performs string formatting, filling a similar role as the sprintf function from C. Details on this formatting operation can be found here.

Additionally, whereas a char in C is effectively a kind of number, and can be used in arithmetic, there's no such implicit equivalence between ints and single-character strings in Python. Instead, you'll want to use the ord function.

P.S. When asking for help with an error message, it's helpful to point out which line Python says is causing the error.

3
  • It's line 24, the one with the string formatting error I made. Thanks for pointing that out, by the way. Should I pass key[j].upper() as an argument to ord(), then? Taking the remainder of that with the modulus operator should have the intended effect, right? Feb 21, 2017 at 22:32
  • Yes, that sounds right.
    – Levi Roth
    Feb 22, 2017 at 1:07
  • Okay, so I got that fixed. But now there's a logic error, and I think it's on lines 26 and 27. I put the code on Pastebin here: pastebin.com/iwqrjqKY. Wherever else you see an error, please point it out. Thanks. Feb 22, 2017 at 10:21

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .