'cs50 - Caesar Cipher - I keep seeing this, error handling non numeric key

I'm working on project work and when I try checking if I've got everything in the code as expected, I see this error,

handles non-numeric key
timed out while waiting for the program to exit.

The code decrypts words or letters being passed into the input with a key. (I just thought I should let you know about that)

here is my actual code. everything seems right except that error code I keep getting each time I check to see all went well.

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

//declaration of function prototype
bool only_digits(string s);
char rotate(char c, int n);

int main(int argc, string argv[])
{
    // string s = argv[1];
    //command line argument
     if(argc != 2 || !only_digits(argv[1]))
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
    //convert argv[1] to an int
    int key = atoi(argv[1]);
    //prompt user for plaintext
    string text = get_string("plaintext: ");
    //output of plaintext
    printf("ciphertext: ");

    for(int i = 0; text[i]; i++)
    {
       text[i] = rotate(text[i], key);
       printf("%c", text[i]);
    }
    printf("\n ");
    return 0;
}

bool only_digits(string s)
{
    for(int i = 0; i < strlen(s); i++)
    {
        //check whether the character inputed is a digit 0 - 9
        if(isdigit(s[i]))
        {
            return true;
        }
        else{
            return false;
        }
    }
    return false;
}

char rotate(char c, int n)
{
    char cipher_text = c;

    if(islower(c))
    {
        cipher_text = 'a' + ((c - 'a') + n) % 26;
        return cipher_text;
    }
    else if(isupper(c))
    {
        cipher_text = 'A' + ((c - 'A') + n) % 26;
        return cipher_text;
    }
    return cipher_text;
}

any help will be much appreciated.



Solution 1:[1]

Here is a working self-contained solution. It hard-codes the clear text:

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

bool only_digits(const char *s);
char rotate(char c, int n);

int main(int argc, char *argv[]) {
    if(argc != 2 || !only_digits(argv[1])) {
        printf("Usage: ./caesar key\n");
        return 1;
    }
    int key = atoi(argv[1]);
    char *cleartext = "test";
    printf("ciphertext: ");
    for(; *cleartext; cleartext++) {
        printf("%c", rotate(*cleartext, key));
    }
    printf("\n");
    return 0;
}

bool only_digits(const char *s) {
    for(; *s && isdigit(*s); s++);
    return !*s;
}

char rotate(char c, int n) {
#define ROTATE2(a, c, n) (a) + (((c) - (a)) + (n)) % 26
    if(islower(c)) {
        return ROTATE2('a', c, n);
    }
    if(isupper(c)) {
        return ROTATE2('A', c, n);
    }
    return c;
}

It fixes the only_digits() to look at all characters unless s contains a non-digit in which case it would fail early. Simplified the rotate a bit using a macro to avoid the duplicate code. You could write a 2nd function instead of the macro if you so choose.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1