Nano Hash - криптовалюты, майнинг, программирование

C - параметры командной строки main()

Это действительно простой вопрос, но я нигде не могу найти окончательного ответа. Я понимаю параметры main, насколько они относятся к:

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

где argc относится к количеству аргументов командной строки, а argv относится к массиву, содержащему каждую из строк. Я создал exe-файл исходного кода из файла .c, но не имею опыта работы с командными строками и не понимаю синтаксиса аргументов командной строки.

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


int main(int argc, char *argv[])
{
    FILE *infile, *outfile;
    int iochar;

    if(argc != 3){
        printf("Usage: filename infile outfile\n");
        exit(1);
    }

    if((infile = fopen(argv[1], "r")) == NULL){
        printf("Can't open input file.\n");
        exit(1);
    }

    if((outfile = fopen(argv[2], "w")) == NULL){
        printf("Can't open output file.\n");
        exit(1);
    }

    while((iochar = getc(infile))!=EOF){
        putc(iochar, outfile);
    }

    fclose(infile);
    fclose(outfile);

    printf("You've reached the end of the program.\n"); 

    return;
}

Предыдущий код должен принимать 3 аргумента и копировать содержимое 2-го аргумента в расположение 3-го аргумента. Что я должен сделать, чтобы это произошло?


  • Кажется, вы задаете здесь два вопроса, которые, похоже, не связаны между собой. И первое — где хранится каждый из этих аргументов — не имеет никакого смысла. Они предоставляются в качестве аргументов функции main(). 09.12.2013
  • Чтобы понять, что здесь происходит, сначала установите точку останова на строке if(argc != 3), а затем проверьте содержимое строк argc и argv. 09.12.2013
  • @sudowned Думаю, лучше сформулировать, как передать аргумент в командную строку? Кажется, я никогда не дойду до точки, где командная строка принимает любой ввод. 09.12.2013
  • Вы не выполняете и не запускаете файл .c. Это ваш исходный код. Сначала вам нужно скомпилировать его в исполняемый файл. 09.12.2013
  • @John Программа всегда завершается на строке if(argc != 3), потому что я вижу следующий оператор печати. Таким образом, argc и argv не принимают никаких значений, потому что ничего не вводилось. 09.12.2013
  • @Aleyha, насколько я понимаю, ваша программа завершает работу после строки if(argc != 3), поэтому вы должны иметь возможность установить точку останова на этой строке, и она должна сработать. 09.12.2013
  • Кажется, я понял, что происходит. Мне нужно было создать исполняемый файл моего исходного кода C. Затем мне нужно было открыть командную строку и ввести 3 аргумента, начиная с местоположения исполняемого файла. Первоначально я пытался просто отладить исходный код, так как я никогда раньше не встраивал файл .c в .exe. И извините, я не был уверен, что вы имели в виду под точкой останова. Мой опыт работы с C очень недостаточен, чтобы быть уверенным. 09.12.2013
  • @Если вы используете Visual Studio, вам не нужно открывать командную строку. Просто создайте свою программу (F7), затем запустите ее (F5) после настройки командной строки в свойствах отладки вашего проекта (согласно моему ответу ниже). 09.12.2013
  • printf("Can't open input file.\n"); — канонический пример бесполезного сообщения об ошибке. Какой файл? Почему вы не можете открыть его? Почему сообщение об ошибке выводится на стандартный вывод, а не на стандартный вывод? Замените эту ужасную строку кода на perror( argv[1] ) и сделайте аналогичную замену для всех остальных сообщений об ошибках. 09.12.2013
  • Код был переписан из моей книги, но я понимаю вашу точку зрения, спасибо. О том, чтобы узнать разницу между различными стандартными потоками. 09.12.2013

Ответы:


1

Вы можете установить аргументы командной строки в свойствах отладки вашего проекта VS.

не понимаю синтаксис аргументов командной строки.

Детали синтаксиса аргументов командной строки зависят от того, какая программа их интерпретирует... VS, ярлык Windows, Windows cmd, bash и т. д. ... но обычно это просто список элементов, разделенных пробелами. Если сами элементы содержат пробелы, кавычки или другие специальные символы, то вам необходимо обратить внимание на правила используемого вами интерпретатора.

Семантика аргументов командной строки определяется вашей программой... в этом случае первый аргумент — это имя входного файла, а второй аргумент — имя выходного файла.

printf("Usage: filename infile outfile\n");

Это нехорошее сообщение об использовании ... "имя файла" должно быть именем вашей программы, которое обычно является значением argv[0]. Таким образом:

printf("Usage: %s infile outfile\n", argv[0]);
09.12.2013
  • То есть технически первым аргументом является фраза ПОСЛЕ расположения программы? Или расположение программы считается первым аргументом? 09.12.2013
  • @Алейха Бывший. Первый аргумент — infile, второй аргумент — outfile. Хотя путь к программе находится в argv (argv[0]), он не считается и не называется аргументом. 09.12.2013
  • @Aleyha Да, argc — это количество элементов в argv, не включая завершающий NULL. В вашем случае argc будет 3. 09.12.2013
  • И последний вопрос, извините за беспокойство. Я попытался установить обозреватель решений -> свойства -> отладка -> аргументы команды на 3 (или это 2, если VS 2012 так интерпретирует аргументы?). Это все еще не вызывает командную строку для меня. Вы имели в виду что-то еще, установив в командной строке свойства отладки проекта? 09.12.2013
  • @Aleyha Вам нужны 2 аргумента - фактические аргументы, а не число. Затем нажмите F5, и ваша программа должна запуститься, скопировать файл и выйти... командной строки не будет. Вы можете установить точку останова в начале программы (дважды щелкните поле первого оператора if, и вы должны получить красный кружок), и она остановится там, и вы сможете пройти программу. Я призываю вас прочитать справку по VS, чтобы ознакомиться с ней — она довольно мощная и поможет вам позже. (Примечание: я в основном работаю с программами с графическим интерфейсом в VS, а не с консольными приложениями, поэтому мои комментарии здесь могут быть немного неправильными.) 09.12.2013
  • Спасибо за вашу помощь. Новичок в программировании на VS/2012/C в таком порядке, и это была последняя тема, которая была освещена довольно поверхностно. 09.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..