31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636

Работа с аргументами командной строки

13.10.2019, 12:42. Показов 2440. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой кусок старого кода на с++
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int help=1;
    char *file=0;
    char *File=0;
    char *blank=0;
    int num1=0;
    int num2=0;
    int vFLag = 0;
    char z = 0;
    bool deb = false;
    
    for(int i=0; i<argc; i++){
        if(ishelp(argv[i])){
            return help;
        }
        else if( strcmp(argv[i],"-v")==0){
            vFLag = 1;
            z = 'v';
        }
        else if(strcmp(argv[i],"-d")==0){
            deb = true;
        }
        else if(strcmp(argv[i],"-s")==0){
            if(argc>i+1){
                file = argv[i+1];
            }
            else {
                std::cerr<<"You didn't mention any script";
                return 1;
            }
        }
        else if(strcmp(argv[i],"-f")==0){
            if(argc>i+1){
                File = argv[i+1];
            }
            else{
                std::cerr<<"You didn't mention any .exe";
                return 1;
            }
        }
        else if(strcmp(argv[i],"-b")==0){
            if(argc>i+1){
                blank = argv[i+1] ;
            }
            else{
                std::cerr<<"emty blank";
                return 1;
            }
        }

Как подобное сделать на шарпе?
Вот часть мейна с которой сейчас работаю:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool vFlag = false;
            int lttNo = -1;
            int lngNo = -1;
            char sep = ' ';
            bool oFlag = false;
            int errors = 0; // кол-во ошибок при анализе файла.
 
            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] == "-?" || args[i] == "/?")
                { 
                    isHelp();
                    Environment.Exit(1);
                }
                else if (args[i].ToLower() == "-help" || args[i].ToLower() == "/help")
                {
                    isHelp();
                    Environment.Exit(1);
                }// Хэлпы работают, остальное нет
                else if (args[i].ToLower() == "-v")
                {
                    vFlag = true;// дальше в методе пишу if(vFlag){вывод доп инфы} и без разницы пишу я это так или в try-cath
                }
                else if (args[i].ToLower() == "-8")
                {
                    oFlag = true; //все равно при a.exe -v ничего не выводит, ну при -8 аналогично
                }                    
                else if (args[i].ToLower() == "-sep")
                {
                    if(args>i+1) // тут куча ошибок, как это реализовать на шарпе??
                        sep = args[i+1]
                }                   
                else if (args[i].ToLower() == "-ltt")
                {
                    lttNo = ...//аналогичино
                }                   
                else if (args[i].ToLower() == "-lng")
                {
                    lttNo = ...//помогите пожалуйста
                }
                    
            }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2019, 12:42
Ответы с готовыми решениями:

Работа с аргументами командной строки
Использую fpc в линуксе . Никак не получается разобраться как же правильно использовать paramcount и paramstr() . буду очень благодарен ,...

Работа с аргументами командной строки
Котаны, комрады. подсобите. Даны переменные A, B, C. Изменить их значения, переместив содержимое A в B, B — в C, C — в A, и вывести новые...

Работа с аргументами командной строки
ПОдскажите, как через аргументы командной строки вывести {1 2 3 4 5} в файл по блочно из массива?

15
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
13.10.2019, 13:26
Цитата Сообщение от Vlast001 Посмотреть сообщение
C#
1
if(args>i+1) // тут куча ошибок, как это реализовать на шарпе??

Vlast001,
C++
1
argc
для шарпика это
C#
1
  args.Length
сразу не обратил внимание. Почему там char ?
C#
1
char sep = ' ';
args это массив строк и получать нужно строку

C#
1
2
3
4
string sep = "";
 
if(args.Length > i+1) 
sep = args[i+1];
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 13:28  [ТС]
Цитата Сообщение от QuestionAnd Посмотреть сообщение
сразу не обратил внимание. Почему там char ?
Что бы парсить, но я забыл про стринг. А парсить нужно тут как я понял:
C#
1
2
3
4
5
6
7
8
9
10
11
else if (args[i].ToLower() == "-ltt")
                {
                    if(args.Length > i + 1)
                    {
                        int.TryParse(args[i + 1], out  lttNo);
                    }
                    else
                    {
                        Console.Error.WriteLine("Empty value");
                    }
                }
Но почему то если написано а.ехе -ltt -lng 2, то ошибка Empty value не появляется
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
13.10.2019, 13:33
А где там в С++ коде разбор таких аргументов ?
Цитата Сообщение от Vlast001 Посмотреть сообщение
C#
1
"-ltt")
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 13:35
Цитата Сообщение от Vlast001 Посмотреть сообщение
если написано а.ехе -ltt -lng 2, то ошибка Empty value не появляется
Так ошибка появляется, если аргумент -ltt последний.
Выводите сообщение если он последний или следующий аргумент — не число:
C#
1
2
3
4
5
                    if(args.Length > i + 1 || !int.TryParse(args[i + 1], out  lttNo))
                    {
                        // И давайте более понятные сообщения об ошибке.
                        Console.Error.WriteLine("Value is missing for -ltt parameter or value is not an integer"); 
                    }
Вариант выше можно разбить на две проверки: сначала на наличие следующего аргумента, а потом на его проверку.
Тогда пользователю можно дать более точное сообщение об ошибке: либо аргумент не указан, либо он не числовой.
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 13:37  [ТС]
Цитата Сообщение от QuestionAnd Посмотреть сообщение
А где там в С++ коде разбор таких аргументов ?
На с++ то старый код, по быстрому нашел, чтобы объяснить что мне нужно сделать на шарпе
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 13:48  [ТС]
kolorotur, ты имвелл ввиду так?
C#
1
2
3
4
5
6
7
8
9
if (args.Length > i + 1 || !int.TryParse(args[i + 1], out lngNo))
                    {
                        // И давайте более понятные сообщения об ошибке.
 
                    }
                    else
                    {
                        Console.Error.WriteLine("Value is missing for -ltt parameter or value is not an integer");
                    }
Но оно не рабатоет
Во вложении ваш вариант, когда все верно и оно выводит Value is missing for -ltt parameter or value is not an integer, а второй вариант мой и он не работает
Миниатюры
Работа с аргументами командной строки  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 14:05
Цитата Сообщение от Vlast001 Посмотреть сообщение
ты имвелл ввиду так?
Нет, я имел в виду так, как написал
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 14:31  [ТС]
kolorotur, Извини, но тогда я не понимаю)
D:\VC\lab5>a -ltt

Необработанное исключение: System.IndexOutOfRangeException: Индекс находился вне границ массива.
в lab5.Program.Main(String[] args)

Добавлено через 4 минуты
Почему на щарпе все так странно, но с++ просто сдела бы так и все
C++
1
2
3
4
5
6
7
8
9
else if(argc>i+1){
                if(isInt(argv[i+1])){
                    lttNo=atoi(argv[i+1]);  
                }
                else{
                    std::cerr << "Please, input valid first num";
                    return 1;
                }
            }
Все так просто) isInt к примеру такой вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
int isInt(const char *ch)
{
    int i=0;
    if ((ch[i] == '+') || (ch[i] == '-'))
                i++;
    for (i; ch[i]!=0; i++)      
    {
        if(isdigit(ch[i])==0)
            return 0;               
    }
    return 1;
}
а на шарпе даже написать строчку const ref char ch без ошибок нельзя
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 14:43
Лучший ответ Сообщение было отмечено Vlast001 как решение

Решение

Цитата Сообщение от Vlast001 Посмотреть сообщение
тогда я не понимаю
А, первое-то условие тоже изменить надо:
C#
1
2
if (i + 1 == args.Length || !int.TryParse(args[i + 1], out  lttNo))
 ... ошибка
Цитата Сообщение от Vlast001 Посмотреть сообщение
с++ просто сдела бы так и все
То же самое бы было, просто условие поменялось.
На плюсах у вас ошибочный случай идет в else, а в коде выше — в if, просто первое условие тоже поменять надо было.

Цитата Сообщение от Vlast001 Посмотреть сообщение
на шарпе даже написать строчку const ref char ch без ошибок нельзя
Там много чего нельзя, что можно в других языках.
И наоборот: можно много чего, что нельзя в других языках.
Согласитесь, это можно сказать о любом языке
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 15:13  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Согласитесь, это можно сказать о любом языке
Как тут не согласится
Цитата Сообщение от kolorotur Посмотреть сообщение
А, первое-то условие тоже изменить надо:
Верно...Блин, уже второй месяц учу шарп и все никак не привыкну
Такой вопрос
C#
1
2
3
4
5
6
7
8
9
10
11
12
else if (args[i].ToLower() == "-ltt")
                {
                    if (i + 1 == args.Length || !int.TryParse(args[i + 1], out lttNo))
                    { 
                        Console.Error.WriteLine("Value is missing for -ltt parameter or value is not an integer");
                    }
                    else
                    {
                        lttNo = Convert.ToInt32(args[i + 1]); // лучше конверт или TryParse? и как я понимаю
                         //если int.TryParse(args[i + 1], out lttNo) то тут больше ничего не нужно, там к примеру присвоить это дело переменной lttNo
                    }
                }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 15:18
Цитата Сообщение от Vlast001 Посмотреть сообщение
уже второй месяц учу шарп и все никак не привыкну
К чему?
if A then B else C равносильно if not A then C else B вне зависимости от языка программирования.

Цитата Сообщение от Vlast001 Посмотреть сообщение
лучше конверт или TryParse?
В данном случае — TryParse.

Цитата Сообщение от Vlast001 Посмотреть сообщение
если int.TryParse(args[i + 1], out lttNo) то тут больше ничего не нужно
Нужно проверить возвращаемое значение. Если оно false, то конвертирование не получилось.
1
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.10.2019, 21:10  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
К чему?
К строгости bool в нутри if, на с++ не так было)


Цитата Сообщение от kolorotur Посмотреть сообщение
Нужно проверить возвращаемое значение. Если оно false, то конвертирование не получилось.
Можно здесь подробнее, как проверить возвращаемое значения? Что именно вы имеете ввиду? Прореветь lttNo до того как класть в int.TryParse(args[i + 1], out lttNo) ?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,218
14.10.2019, 00:25
Vlast001, .TryParse возвращает bool, если все хорошо, out lttNo будет равен нулю, если все плохо или значению если все хорошо, проверяй всё ли хорошо, прежде чем использовать lttN

З.Ы. прочитать учебник уйдет меньше времени, чем задавать глупые вопросы на форуме и ждать...
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
14.10.2019, 15:15  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
TryParse возвращает bool, если все хорошо, out lttNo будет равен нулю, если все плохо или значению если все хорошо,
Я это читал на MSDN перед тем как первый раз воспользовался. И из-за этого определения я спросил в какой момент проверять lttNo и стоит ли это делать, так как если не удается конвертировать трайпарс вернет ноль, а ты мне просо посоветовал еще раз прочитать это определение, ну молодец че еще сказать
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.10.2019, 16:19
Цитата Сообщение от Vlast001 Посмотреть сообщение
К строгости bool в нутри if, на с++ не так было
Да, в шарпе нельзя что угодно использовать в условии в качестве булевого значения, но в оригинальном коде на С++ это нигде и не делается.
Или вы о чем-то другом?

Цитата Сообщение от Vlast001 Посмотреть сообщение
И из-за этого определения я спросил в какой момент проверять lttNo и стоит ли это делать, так как если не удается конвертировать трайпарс вернет ноль
Если метод TryParse вернул false, то возникла какая-то проблема при конвертировании.
Что делать в этом случае — зависит исключительно от вас: выдать сообщение об ошибке, присвоить какое-нибудь значение по умолчанию, использовать нулевое значение и т.п.
Если же метод TryParse верул true, значит все прошло хорошо и в переменной lttNo хранится числовое значение, представленное указанной строкой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.10.2019, 16:19
Помогаю со студенческими работами здесь

Работа с аргументами командной строки, stream!=null
Пишу прогу, которая будет принимать в качестве аргументов командной строки текстовые файлы, брать из них числа и выводить по порядку. ...

Работа с аргументами командной строки, не могу найти ошибку
Господа, пытаюсь написать программу, которая будет принимать 3 аргумента, в виде: ./progName fileName.txt word1 word2 где fileName.txt...

Отладка с аргументами командной строки
Приложение получает аргументы через командною строку, то есть в командной строке вводим: &quot;start имя_файла.exe аргумент1...

Как пользоваться аргументами командной строки?
Как пользоваться аргументами Командной строки. Для лучшего понимания, как пользоваться аргументами командной строки, приводится ниже...

Как пользоваться аргументами командной строки?
Стр. 185. Г. Шилдт: Как пользоваться аргументами Командной строки. Для лучшего понимания, как пользоваться аргументами командной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

Новые блоги и статьи
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru