Аргументы командной строки с параметрами

Поэтому мне нужно написать программу, которая содержит два возможных варианта в зависимости от того, что выбирает пользователь, вводя либо -i, либо -w. Я новичок в аргументах командной строки в целом и понятия не имею, как это сделать. Пока у меня есть:

#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc == -'i') {
        puts("Test 1");
    }

    else if (argc == -'w') {
        puts("Test 2");
    }  

return 0;
}

Он ничего не печатает ... Приветствуются любые объяснения. Я просто пытаюсь понять логику этого.

argc - это количество аргументов, argv - это вектор аргумента, где хранятся данные параметров. Вы смотрите на количество аргументов в своем фрагменте.
mholle 24.04.2018 01:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
32
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы должны проверить argv [i], где i - номер массива вводимого аргумента командной строки, argv [0] будет именем вызываемого файла, а после этого argv [1] будет первым оператором, argv [2 ] следующий и так далее

Ответ принят как подходящий

Прежде всего, вы сравниваете апельсины с апелляциями. argc хранит количество аргументы. Во-вторых, даже если бы вы использовали argv[1], сравнение все равно было бы неправильно, потому что это будет сравнение указателей, а не содержимого. Обратите внимание, что в C строка - это последовательность символов, которая заканчивается байтом, завершающим '\0'. Переменная char* указывает только на начало этой последовательности. Оператор == проверяет равенство значений, в случае указателей (и строковых литералов) он сравнивает, указывают ли оба указателя на одно и то же место.

Когда вы хотите сравнить строки, вы должны сравнить сами строки, это означает, что вам нужно сравнить содержимое, на которое указывают указатели. Для строк вы должны использовать функцию strcmp следующим образом:

#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "usage: %s option\n", argv[0]);
        return 1;
    }

    if (strcmp(argv[1], "-i") == 0)
        puts("Test 1");
    else if (strcmp(argv[1], "-w") == 0)
        puts("Test 2");
    else {
        fprintf(stderr, "Invalid option '%s'\n", argv[1]);
        return 1;
    }

    return 0;
}

Обратите внимание, что сначала важно проверить, достаточно ли у вас командной строки аргументы (первый if моего кода). Если пользователь не передал аргумент, argc будет 1, а argv[1] будет указывать на NULL, что приведет к неопределенному поведение, если оно передано в strcmp. Вот почему я делаю strcmp только тогда, когда 100% уверен, что argv[1] это не NULL.

Также, если вы пишете код для системы POSIX (Linux, Mac и т. д.), Я рекомендую использовать getopt для анализа аргументов командной строки.

Кажется, что объяснение того, что количество аргументов командной строки задается количество аргументов (argc) с указателем на каждый аргумент (хранящимся как строка прекращенный), предоставленным в вектор аргумента (*argv[]), помогает концепции понять.

David C. Rankin 24.04.2018 01:56
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("The name of the program is %s\n", argv[0]);
    if ( strcmp(argv[1], "-i") == 0 ) { puts("Test 1"); }
    if ( strcmp(argv[1], "-w") == 0 ) { puts("Test 2"); }  

return 0;
}

Это не сработает, если не будут переданы аргументы, так как он будет вызывать strcmp с NULL.

Pablo 24.04.2018 01:11

Пожалуйста, отредактируйте этот вопрос, чтобы описать, что делает этот код, чтобы ответить на особенности вопроса. stackoverflow.com/help/how-to-answer

bignose 24.04.2018 03:17

argc означает «количество аргументов». означает количество аргументов

argv - это двумерный массив. Строки - это одномерные массивы символов в C. Второе измерение исходит из того, что у вас есть несколько String.

Итак, если вам нужен первый аргумент String, вы должны получить к нему доступ следующим образом:

argv[0]

Вы также пытаетесь сравнить строки, длина которых превышает 1 символ. Вы должны использовать strcmp для сравнения строк в C. См. Как правильно сравнивать строки?

и если вы хотите сравнить равенство, вы не должны использовать ==, == предназначен для базовых типов данных, таких как int или char.

argc представляет количество параметров, которые были переданы в командной строке, включая само имя программы.

В c символ, например 'i', представляет собой 8-битное число, представляющее код ASCII буквы i. Итак, ваш условный оператор if (argc == -'i') на самом деле проверяет, является ли -105 (105 - это значение ascii буквы i) числом аргументов, переданных вашей программе.

Чтобы проверить, являются ли переданные аргументы "-i" или "-w", вам необходимо выполнить сравнение строк, используя функции библиотеки c или ваш собственный алгоритм, и вам необходимо сравнить эти строки с argv[i] (где i - позиция параметра, который вы проверка в вызове программы)

Другие вопросы по теме