2016-04-15 4 views
2

У меня возникли проблемы с выяснением того, как этот код работает. Предполагается, что в зависимости от аргументов, выданных из командной строки, предполагается распечатать приветствие.Командная строка Аргумент

int main (int argc, char *argv[]) { 

double testscore; 

    if (argc == 2) { 
     printf("Hello, Mr.%s.\n", argv[1]); 

    } 
    else if (argc == 3 && argc == testscore) { 
     testscore = atof(argv[2]); 
     printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
    } 
    else { 

     printf("My name is %s %s.\n", argv[1], argv[2]); 
    } 
} 

Если кто-то ставит только свою фамилию, то терминал распечатает ...

Здравствуйте, г-н last_name

... потому что они только положить в одном аргумент. Это прекрасно работает.

Часть, в которой я застрял, является аргументом командной строки == 3. Если 3 аргументы приведены, то либо терминал, предполагают, чтобы распечатать ...

Привет, мистер last_name, ваш счет тест test_score

... или ...

Меня зовут first_name last_name.

Если я ставлю в аргументы командной строки только последнее имя и оценка теста (Smith 3,4), то он печатает (например, используя фамилию Smith), то он печатает ...

Меня зовут Смит 3.4

Однако, это работает для ввода имени и фамилии (Джон Смит). Это дает ...

Меня зовут Джон Смит.

Я не хочу ответ, я просто хочу, что я делаю неправильно и подсказки о том, как это исправить.

+0

"Начинаясь с C++" Тони Гэддисом, верно? В любом случае, спасибо за то, что вы не просили код прямо. Это редкость среди новичков. – CodeMouse92

+0

Это простая опечатка. Вы тестируете 'argc == testscore', который тестирует ** количество аргументов ** по счету. Таким образом, второе условие никогда не будет оцениваться истинным (за исключением какой-то странной случайности). – CodeMouse92

+2

'testscore' неинициализирован, поэтому вы не можете с пользой сравнить его, прежде чем устанавливать его. Вероятно, вы должны попытаться преобразовать 'argv [2]' с 'atof()' ('strtod()' будет лучше, но сложнее получить право) и сравнить результат с 0.0. Это немного лениво, но, вероятно, разумно предположить, что если результат равен нулю, 'argv [2]' не содержит числа, поэтому рассматривайте его как имя. (Более тщательная работа будет использовать 'strtod()' и проверить, было ли найдено число, такое как 0.) Возможно, вам захочется подумать, что произойдет, если программе не переданы аргументы командной строки или если они переданы из 20 из них. Вы должны проверить? –

ответ

2

Ваша проблема с этой линии:

else if (argc == 3 && argc == testscore) { 

В самом деле, когда ARGC == 3, то вы хотите проверить, если ARGV [2] является числовым аргументом.

else if ((argc==3) && (is_numeric_arg(argv[2])==1)) { 

Возможная реализация будет:

int is_numeric_arg(char* arg) 
    { 
     int isInt = 0; 
     int isFloat = 0; 
     int isChar = 0; 
     char* currChar; 
     int i = 0; 
     currChar = arg; 
     isInt = 1; 
     while (*currChar != '\0') 
     { 
      if(*currChar < '0' || *currChar > '9') 
      { 
       if(*currChar == '.' && isInt == 1) 
       { 
        isInt = 0; 
        isFloat = 1; 
       } 
       else 
       { 
        isInt = 0; 
        isChar = 1; 
       } 
      } 
      currChar++; 
     } 
     if (isChar == 1){ return 0; } // argument is a string 
     else { return 1; } // argument is a int or float 
    } 

int main (int argc, char *argv[]) { 

    double testscore; 

    if (argc == 2) { 
     printf("Hello, Mr.%s.\n", argv[1]); 

    } 
    else if ((argc==3) && (is_numeric_arg(argv[2])==1)) { 
     testscore = atof(argv[2]); 
     printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
    } 
    else { 

     printf("My name is %s %s.\n", argv[1], argv[2]); 
    } 
} 

Я не проверял код и есть, вероятно, лучший способ проверить, что аргумент из командной строки «Числовой».

+0

Спасибо. Я понял это. Я буду возиться с ним и посмотреть, как лучше проверить аргумент из командной строки «numeric». – SoonPro

+0

На самом деле, один вопрос, почему в выражении if if (* currChar == '.' && isInt == 1) { isInt = 0; isFloat = 1; } isInt установлен в 0 в этом и в выражении else, но до того, как он равен 1? Еще раз спасибо. – SoonPro

+0

Идея состояла в том, чтобы прекратить проверку числового значения, как только мы увидим символ. В принципе, строка «if (* currChar ==.. && isInt == 1)» всегда является ложной, как только мы получаем символ. Как я уже сказал, это быстрое и грязное выполнение «is_numeric». Вы также могли использовать функцию sscanf или другую библиотеку C++ для проверки числового значения. – ssinfod

3

Я не хочу ответа, я просто хочу, что я делаю неправильно, и намекает, как его исправить.

Задача 1: Вы используете переменную testscore перед ее инициализацией.

Задача 2: Вы не выполняете обработку ошибок с помощью atof. Я бы предложил использовать strtod(). Вы можете выполнить некоторую обработку ошибок с ним, чтобы знать, что третий аргумент является float или нет. Вы также можете создать свою собственную реализацию atof(), которая будет конвертировать и сообщать об ошибке при конверсии, если таковая имеется.

Подсказка: попробуйте сначала проверить, что количество аргументов передано программе c. После этого попробуйте преобразовать третий аргумент в float с помощью strtod() или вашей собственной реализации. Если он успешно конвертирует, присвойте результат поплавковой сортировки test_score и распечатайте last_name и testscore. Если нет, то рассмотрите третий аргумент как last_name и распечатайте first_name и last_name.

0

Получил ответ ребятам. Чтобы проверить это, не используя другую функцию, было бы

....

else if (argc==3 && sscanf(argv[2], "%f", testscore) 


{ 


    testscore = atof(argv[2]); 

    printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore); 
} 

...

Смежные вопросы