Что мне нужно изменить, чтобы cs50 Caesar печатал правильное сообщение только после того, как я перебрал каждый символ? - PullRequest
1 голос
/ 02 апреля 2020

Я застрял, пытаясь перебрать каждый символ, чтобы определить, является ли он ди git, при этом печатая ответ только один раз. У меня проблема в том, что я могу определить, является ли символ ди git или нет, но он выводит ответ для каждого введенного числа, пока не достигнет буквы. Я смотрю, как заставить его определять, является ли ввод цифрой или буквой, а затем принимать решение о том, что выводить на печать, вместо того, чтобы печатать каждый раз при обнаружении числа. Чувствую, что это что-то с моим для l oop, но не могу понять это. Спасибо.

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

int main(int argc, string argv[])
{    
    string n = argv[1];
    if (argc != 2)
    {
        printf("usage: ./caesar key\n");
        return 1;
    }
    else
    {
        for(int i = 0, length = strlen(n); i < length; i++)
            if(!isdigit(n[i]))
            {
                printf("usage: ./caesar key\n");
                return 1;
            }
            else
            {
                int convert = atoi(n);
                printf("Success\n");
                printf("%i\n", convert);
            }
    }
}


Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Проблема в том, что внутри for есть оператор if-else ... это означает, что один из них всегда будет выполняться для каждой итерации. Для успешной печати всего один раз вы должны стереть ключевое слово else (и для ясности скобки), но сохранить код else.

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

int main(int argc, string argv[])
{    
    string n = argv[1];
    if (argc != 2)
    {
        printf("usage: ./caesar key\n");
        return 1;
    }
    else
    {
        for(int i = 0, length = strlen(n); i < length; i++)
        {
            if(!isdigit(n[i]))
            {
                printf("usage: ./caesar key\n");
                return 1;
            }         
        }
        int convert = atoi(n);
        printf("Success\n");
        printf("%i\n", convert);   
    }
}
0 голосов
/ 02 апреля 2020

Что мне нужно изменить, чтобы cs50 Цезарь печатал правильное сообщение только после того, как я перебрал каждый символ?

Кажется, вы не знаете, что вам не нужно сделай это. Спецификация Цезаря гласит:

  • Можно предположить, что, если пользователь предоставит аргумент командной строки, это будет неотрицательное целое число (например, 1 ). Не нужно проверять, что это действительно цифра c.
...