Home > front end >  What is happening to the printf function?
What is happening to the printf function?

Time:08-22

I am attempting to write the substitution program here https://cs50.harvard.edu/x/2022/psets/2/substitution/

here is my code:

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

int main(int argc, string argv[1])
{
    if (argc > 2 || argc < 2){
        printf("Plz 1 word in command \n");
        return 1;
    }
    int sum = 0;
    string arg1 = argv[1];


    //test
    for (int i = 0; i < strlen(arg1); i  ){
        if (isalpha(arg1[i]) == 0){
            printf("plz only alphabet character \n");
            return 1;
        }}
    // convert all key to upper
    for (int i = 0; i < strlen(arg1); i  ){
        arg1[i] = toupper(arg1[i]);
     }
    for (int i = 0; i < strlen(arg1); i  ){
          sum = sum   (int)(arg1[i]);
    }
    if (strlen(arg1) != 26){
        printf("Plz input 26 char \n");
        return 1;
    } else if (sum != 2015){printf("no oveerlapping letter plz \n");
    return 1; }
    //test finish
    string al = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string pt = get_string("plaintext: ");
    char pt1[strlen(pt)]; 
    char cp[strlen(pt)]; 
    // all plain text to upper
    for (int i = 0; i < strlen(pt); i  ){
        pt1[i]=toupper(pt[i]);
    }
    //scan
    for (int a = 0; a < strlen(pt); a  ){
        char b = pt1[a];
        for (int i = 0; i < strlen(al); i  ){
             if ( al[i] == b){
                   cp[a] = arg1[i];
                   break;
             } else {
                cp[a] = b;
             }
        }
    //case preserve
      if (islower(pt[a])){
         cp[a] = tolower(cp[a]);
    }} 

       printf("ciphertext: %s \n", cp);
       return 0;
}

when i type in the key YTNSHKVEFXRBAUQZCLWDMIPGJO and then type "hello!1 lmao" as plaintext, here is what i receive

substitution/ $ ./substitution YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext: hello!1 lmao
ciphertext: ehbbq!1 bayq� 

it should only show ehbbq!1 bayq but it is showing more letter than i intended, there might be other letter or simbol after "bayq", can someone explain to me what is going on and why there are additional text in my output?

CodePudding user response:

You need a null terminatig character (usually it is character having integer value 0) to terminate the string

    size_t a;
    for (a = 0; a < strlen(pt); a  )
    {
        char b = pt1[a];
        for (int i = 0; i < strlen(al); i  )
        {
             if ( al[i] == b)
             {
                   cp[a] = arg1[i];
                   break;
             } else {
                cp[a] = b;
             }
        }
    //case preserve
        if (islower((unsigned char)pt[a]))
        {
            cp[a] = tolower((unsigned char)cp[a]);
        }
    }
    cp[a]  = 0;

you need to pass unsigned char to functions like tolower. I did not analyze the logic of your code as it is your home work.

Also cp is too short, it has to be char cp[strlen(pt) 1];

CodePudding user response:

Your char arrays as declared are too short to handle copies of the data, due to the need for a null-terminator att the end.

    char pt1[strlen(pt)]; 
    char cp[strlen(pt)]; 

Rather you need to do:

    char pt1[strlen(pt)   1]; 
    char cp[strlen(pt)   1]; 

However, the other approach would be to simply use strdup to dynamically allocate sufficient storage and copy the data.

    char pt1 = strdup(pt); 
    char cp = strdup(pt); 

Of course, any function that returns dynamically allocated memory (likely including cs50's get_string) means you should remember to free that memory. And ensure it actually succeeded.

  • Related