Как мне написать код, чтобы запретить ввод не-числовых c данных, используя пробную версию argv [1] [i] Кажется, что это работает - PullRequest
0 голосов
/ 06 апреля 2020

Эй, ребята, я не знаю, где я тут ошибся, когда я впервые пытался использовать int main (int arg c, argv [])… Я просто не знаю, правильно ли я его использую. Вот какой-то код…

  1. код компилируется должным образом и также дает мне правильный результат

шифрует «BaRFoo» как «FeVJss», используя 4 в качестве ключа запуска журнала. / Цезарь 4 ... отправка ввода BaRFoo ... проверка на вывод "ciphertext: FeVJss \ n" ...

***** НО, вот моя проблема, когда я набираю 2r или 4w или любой без нумерации c ключ дает мне это сообщение: ***

:( обрабатывает нечисловую c тайм-аут ключа в ожидании выхода из программы

Может кто-нибудь сказать мне, как добавить еще одну l oop для этой функции, чтобы получить ключ nummerica для печати в виде ключа -Usage: ./caesar. Пожалуйста? Большое спасибо за помощь и полезный совет.

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



int main(int argc, string argv[])

{
    // Variable declarations
    bool keySuccessful = false;
    int key = 0;
    int input_length = 0;
    string text = "" ;
    // The number of command line args submitted was incorrect.
    do
    {
    if(argc != 2)
    {
        printf("Usage: ./caesar key .\n");
        return 1;
    }
    else
    {
      // Convert ASCII char to a alphabate char
      // Access individul char in the string plain
      // get the key val and converted to integer
      key = atoi(argv[1]);
      keySuccessful = true;
      printf("%s",argv[1]);
    }
    }
    while(!keySuccessful);

    // get user input
    text = get_string("%s",text);
    printf("ciphertext: ");
    input_length = strlen(text);

        for (int i=0; i<input_length; i++)
        {
        // Checking if is the lowercase a=97 to z=112
        // Print out lower case with ky a=65 to z=90
           if(isupper(text[i]))
            {
                printf("%c", (((text[i] - 65) + key) % 26) + 65);
            }
            else if(islower(text[i]))
            {
                printf("%c", (((text[i] - 97) + key) % 26) + 97);
            }
            else
            {
                printf("%c", text[i]);
            }
        }


    printf("\n");
    return 0;


}


Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

вы должны сделать код, если пользователь подскажет что-то вроде

$ ./caesar 20x

вы должны напечатать

Использование: ./caesar key

for (int i = 0 , n = strlen(argv[1]); i < n; i++)
{
    if (isalpha(argv[1][i]))
        {
            printf("Usage: ./caesar key\n");
            return 1; 
        }
}
0 голосов
/ 06 апреля 2020

Если я правильно понял ваш вопрос, вы хотите убедиться, что первым аргументом является число, и в противном случае остановить выполнение. Вы можете легко сделать это, зацикливаясь на аргументе, и проверяя вывод isdigit() из ctype.h для каждого символа, например так:

int argumentIsNumber = 1;
for (int i = 0; i < strlen(argv[1]); i++) {
    if (isdigit(argv[1][i]) == 0) {
        argumentIsNumber = 0;
    }
}

if (argumentIsNumber == 0) {
    // Tell the user the introduced key is wrong
}

Как вы видите в этом примере, вы можете установить флаг на 1 и меняйте его на 0 каждый раз, когда не-di git найден. Затем, когда l oop заканчивается, у вас есть только 1 флаг, если все символы были цифрами.

Надеюсь, это поможет!

...