CS50 CAESAR - различный вывод в зависимости от положения выписки, но я не понимаю, почему - PullRequest
0 голосов
/ 07 февраля 2020

В приведенном ниже коде я получаю разные выходные данные в зависимости от того, где я размещаю оператор Printf ("Ciphertext:)", и я не могу понять, почему. Может ли кто-нибудь указать, что мне не хватает? Ниже вы можете найти код и вывод (переменная часть выделена жирным шрифтом).

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


int main(int argc, string argv[]) 
{
int j = strlen(argv[1]); 
if (argc != 2) 
    {
    printf ("Usage: ./caesar key\n");
    return (1);
    }  

else 
   { 

    for (int i = 0; i < j; i++)
        { 
            if (!isdigit (argv[1][i]))
            {
                printf ("Fail\n");
                return(1);     
            }
        }  

          int convert = atoi (argv[1]) ;


          string Plaintext = get_string("Plaintext: ");
          int z = strlen(Plaintext);
          **printf("Ciphertext: ");** 

          for (int i = 0; i<z;i++)
          {
             char Ciphertext [z];
             Ciphertext [i] = (Plaintext [i] + 1);
            }


            for (int i = 0; i<z;i++)
          {
              char Ciphertext [z];
              printf("%c", Ciphertext [i]);   
            }
        printf("\n");




    }   



}  

Если я запускаю ./caesar с этим кодом и вводим «Hey» в текстовом приглашении, вывод будет Ciphertext: ifz, с которым я Я счастлив. Однако, когда я помещаю оператор printf ("Ciphertext:") в место, которое кажется мне более логичным, я не получаю такой же вывод:

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


int main(int argc, string argv[]) 
{
int j = strlen(argv[1]); 
if (argc != 2) 
    {
    printf ("Usage: ./caesar key\n");
    return (1);
    }  

else 
   { 

    for (int i = 0; i < j; i++)
        { 
            if (!isdigit (argv[1][i]))
            {
                printf ("Fail\n");
                return(1);     
            }
        }  

          int convert = atoi (argv[1]) ;


          string Plaintext = get_string("Plaintext: ");
          int z = strlen(Plaintext);


          for (int i = 0; i<z;i++)
          {
             char Ciphertext [z];
             Ciphertext [i] = (Plaintext [i] + 1);
            }

            **printf("Ciphertext: ");** 


            for (int i = 0; i<z;i++)
          {
              char Ciphertext [z];
              printf("%c", Ciphertext [i]);   
            }
        printf("\n");




    }   



}  

Когда я делаю точное то же самое здесь, я печатаю Ciphertext: и пустую строку, но он не печатает Ciphertext [], как указано выше. Есть идеи?

1 Ответ

0 голосов
/ 07 февраля 2020

Как отмечено usr2564301 в комментарии , вам нужно объявить Ciphertext один раз, чтобы он не go вышел из области видимости. Когда он выходит из области видимости, старое значение формально теряется - вы можете или не можете увидеть его снова (поскольку доступ к неинициализированной памяти является неопределенным поведением, поэтому любой результат действителен).

Обратите внимание, что хотя вы конвертируйте argv[1] в целое число, вы не используете результат. Символ + 1 в кодировке означает, что он выглядит так, как будто вы всегда указали 1 как argv[1]. Ваш код не выполняет перенос, поэтому z отображается на a. Он также неправильно обрабатывает прописные и строчные буквы. Вы, вероятно, не должны пытаться кодировать не буквы, либо. Однако, эта довольно простая адаптация вашего кода, по крайней мере, производит видимость результата:

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
//#include <stdlib.h>    // Needed if atoi() is called
#include <string.h>

int main(int argc, string argv[])
{
    // This checking is not relevant while the encryption only adds 1
    if (argc != 2)
    {
        printf("Usage: ./caesar key\n");
        return(1);
    }
    int j = strlen(argv[1]);
    for (int i = 0; i < j; i++)
    {
        if (!isdigit(argv[1][i]))
        {
            printf("Fail\n");
            return(1);
        }
    }
    // int convert = atoi(argv[1]);

    string Plaintext = get_string("Plaintext: ");
    int z = strlen(Plaintext);
    char Ciphertext[z];

    for (int i = 0; i < z; i++)
    {
        Ciphertext[i] = (Plaintext[i] + 1);    // Should use convert, etc
    }

    printf("Ciphertext: ");

    for (int i = 0; i < z; i++)
    {
        printf("%c", Ciphertext[i]);
    }
    printf("\n");
    return 0;
}

Пример выполнения (программа cs79, созданная из исходного кода cs79.c):

$ cs79 13
Plaintext: Bright vixens jump; dozy fowl quack.
Ciphertext: Csjhiu!wjyfot!kvnq<!ep{z!gpxm!rvbdl/
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...