Публичная функция getWeb (ByRef sURL As String) As String Dim myWebClient As New System.Net.WebClient () Попробуйте отключить myCredentialCache как новый System.Net.CredentialCache () Dim myURI As New Uri (sURL) myCredentialCache. Добавить (myURI, «ntlm», System.Net.CredentialCache.DefaultNetworkCredentials) myWebClient.Encoding = System.Text.Encoding.UTF8 myWebClient.Credentials = myCredentialCache Возвращает myWebClient.DownloadString (myURI) Catch ex As Exception Возврат «Исключение» & amp; ex.ToString () End Try End Function
/*
Here's a rough one not relying on any libraries.
Example:
-wi | -iw //word case insensitive
-li | -il //line case insensitive
-- file //specify the first filename (you could just get the files
as positional arguments in the else statement instead)
PS: don't mind the #define's, they're just pasting code :D
*/
#ifndef OPT_H
#define OPT_H
//specify option requires argument
#define require \
optarg = opt_pointer + 1; \
if (*optarg == '\0') \
{ \
if (++optind == argc) \
goto opt_err_arg; \
else \
optarg = argv[optind]; \
} \
opt_pointer = opt_null_terminator;
//start processing argv
#define opt \
int optind = 1; \
char *opt_pointer = argv[1]; \
char *optarg = NULL; \
char opt_null_terminator[2] = {'\0','\0'}; \
if (0) \
{ \
opt_err_arg: \
fprintf(stderr,"option %c requires argument.\n",*opt_pointer); \
return 1; \
opt_err_opt: \
fprintf(stderr,"option %c is invalid.\n",*opt_pointer); \
return 1; \
} \
for (; optind < argc; opt_pointer = argv[++optind]) \
if (*opt_pointer++ == '-') \
{ \
for (;;++opt_pointer) \
switch (*opt_pointer) \
{
//stop processing argv
#define done \
default: \
if (*opt_pointer != '\0') \
goto opt_err_opt; \
else \
goto opt_next; \
break; \
} \
opt_next:; \
}
#endif //opt.h
#include <stdio.h>
#include "opt.h"
int
main (int argc, char **argv)
{
#define by_character 0
#define by_word 1
#define by_line 2
int cmp = by_character;
int case_insensitive = 0;
opt
case 'h':
puts ("HELP!");
break;
case 'v':
puts ("fileCMP Version 1.0");
break;
case 'i':
case_insensitive = 1;
break;
case 'w':
cmp = by_word;
break;
case 'l':
cmp = by_line;
break;
case '-':required
printf("first filename: %s\n", optarg);
break;
done
else printf ("Positional Argument %s\n", argv[optind]);
return 0;
}
Насколько мне известно, три наиболее популярных способа анализа аргументов командной строки в C:
#include <unistd.h>
из библиотеки POSIX C), который может решить простой анализ аргументов . Если вы немного знакомы с bash, getopt встроенный bash основан на Getopt из GNU libc. #include <argp.h>
из библиотеки GNU C), который может решить больше сложных задач и позаботится о таких вещах, как, например: -?
, --help
для справочного сообщения , включая адрес электронной почты -V
, --version
для информации о версии --usage
для сообщения об использовании В документации библиотеки GNU C есть несколько хороших примеров для Getopt и Argp.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
bool isCaseInsensitive = false;
int opt;
enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;
while ((opt = getopt(argc, argv, "ilw")) != -1) {
switch (opt) {
case 'i': isCaseInsensitive = true; break;
case 'l': mode = LINE_MODE; break;
case 'w': mode = WORD_MODE; break;
default:
fprintf(stderr, "Usage: %s [-ilw] [file...]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
// Now optind (declared extern int by <unistd.h>) is the index of the first non-option argument.
// If it is >= argc, there were no non-option arguments.
// ...
}
#include <argp.h>
#include <stdbool.h>
const char *argp_program_version = "programname programversion";
const char *argp_program_bug_address = "<your@email.address>";
static char doc[] = "Your program description.";
static char args_doc[] = "[FILENAME]...";
static struct argp_option options[] = {
{ "line", 'l', 0, 0, "Compare lines instead of characters."},
{ "word", 'w', 0, 0, "Compare words instead of characters."},
{ "nocase", 'i', 0, 0, "Compare case insensitive instead of case sensitive."},
{ 0 }
};
struct arguments {
enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode;
bool isCaseInsensitive;
};
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
struct arguments *arguments = state->input;
switch (key) {
case 'l': arguments->mode = LINE_MODE; break;
case 'w': arguments->mode = WORD_MODE; break;
case 'i': arguments->isCaseInsensitive = true; break;
case ARGP_KEY_ARG: return 0;
default: return ARGP_ERR_UNKNOWN;
}
return 0;
}
static struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0 };
int main(int argc, char *argv[])
{
struct arguments arguments;
arguments.mode = CHARACTER_MODE;
arguments.isCaseInsensitive = false;
argp_parse(&argp, argc, argv, 0, 0, &arguments);
// ...
}
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
bool isCaseInsensitive = false;
enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;
size_t optind;
for (optind = 1; optind < argc && argv[optind][0] == '-'; optind++) {
switch (argv[optind][1]) {
case 'i': isCaseInsensitive = true; break;
case 'l': mode = LINE_MODE; break;
case 'w': mode = WORD_MODE; break;
default:
fprintf(stderr, "Usage: %s [-ilw] [file...]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
// *argv points to the remaining non-option arguments.
// If *argv is NULL, there were no non-option arguments.
// ...
}
Отказ от ответственности: я новичок в Argp, пример может содержать ошибки.
Docopt имеет реализацию C, которую я считал довольно приятной: https://github.com/docopt/docopt.c
Из стандартного формата в формате man, параметры командной строки, docopt infers и создает парсер аргументов. Это началось в python; версия python буквально просто анализирует docstring и возвращает dict. Для этого в C требуется немного больше работы, но он чист в использовании и не имеет внешних зависимостей.
Если я могу использовать собственный рожок, я также хотел бы предложить взглянуть на библиотеку разбора параметров, которую я написал: dropt .
Одна из функций, которую он предлагает, что многие другие не поддерживают переопределение предыдущих параметров. Например, если у вас есть псевдоним оболочки:
alias bar="foo --flag1 --flag2 --flag3"
, и вы хотите использовать bar
, но с отключенным --flag1
, это позволяет:
bar --flag1=0
Учебный шаблон для синтаксического анализа аргументов командной строки в C.
C:> programName -w-fileOne.txt fileTwo.txt
BOOL argLine = FALSE;
BOOL argWord = FALSE;
BOOL argChar = FALSE;
char * fileName1 = NULL;
char * fileName2 = NULL;
int main(int argc, char * argv[]) {
int i;
printf("Argument count=%d\n",argc);
for (i = 0; i < argc; i++) {
printf("Argument %s\n",argv[i]);
if (strcmp(argv[i],"-l")==0) {
argLine = TRUE;
printf(" argLine=TRUE\n");
}
else if (strcmp(argv[i],"-w")==0) {
argWord = TRUE;
printf(" argWord=TRUE\n");
}
else if (strcmp(argv[i],"-c")==0) {
argChar = TRUE;
printf(" argChar=TRUE\n");
}
else if (strcmp(argv[i],"--")==0) {
if (i+1 <= argc) {
fileName1 = argv[++i];
printf(" fileName1=%s\n",fileName1);
}
if (i+1 <= argc) {
fileName2 = argv[++i];
printf(" fileName2=%s\n",fileName2);
}
}
}
return 0;
}
_Bool
все время и заголовок <stdbool.h>
, который определяет bool
как _Bool
и true
и false
и __bool_true_false_are_defined
, все макросы (которые, в исключительных случаях, могут быть неопределенными и переопределяется без вызова неопределенного поведения, однако эта лицензия помечена как «устаревшая»). Итак, если у вас есть компилятор C99, вы можете использовать <stdbool.h>
и bool
. Если нет, вы либо пишете один для себя (это не сложно), либо вы используете родной эквивалент.
– Jonathan Leffler
10 March 2012 в 20:51
Используйте getopt()
или, возможно, getopt_long()
.
int iflag = 0;
enum { WORD_MODE, LINE_MODE } op_mode = WORD_MODE; // Default set
int opt;
while ((opt = getopt(argc, argv, "ilw") != -1)
{
switch (opt)
{
case 'i':
iflag = 1;
break;
case 'l':
op_mode = LINE_MODE;
break;
case 'w':
op_mode = WORD_MODE;
break;
default:
fprintf(stderr, "Usage: %s [-ilw] [file ...]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
/* Process file names or stdin */
if (optind >= argc)
process(stdin, "(standard input)", op_mode);
else
{
int i;
for (i = optind; i < argc; i++)
{
FILE *fp = fopen(argv[i], "r");
if (fp == 0)
fprintf(stderr, "%s: failed to open %s (%d %s)\n",
argv[0], argv[i], errno, strerror(errno));
else
{
process(fp, argv[i], op_mode);
fclose(fp);
}
}
}
Обратите внимание, что вам нужно определить, какие заголовки должны включать (I сделайте 4, которые требуются), и способ, которым я написал тип op_mode
, означает, что у вас есть проблема в функции process()
- вы не можете получить доступ к перечислению там. Лучше всего переместить перечисление вне функции; вы можете даже сделать op_mode
переменную с файлом без внешней привязки (причудливый способ сказать static
), чтобы избежать передачи ее функции. Этот код не обрабатывает -
как синоним стандартного ввода, другое упражнение для читателя. Обратите внимание, что getopt()
автоматически выполняет --
, чтобы отметить конец опций для вас.
Я не запускал какую-либо версию ввода выше компилятора; в нем могут быть ошибки.
Для дополнительного кредита напишите функцию (библиотека):
int filter(int argc, char **argv, int idx, int (*function)(FILE *fp, const char *fn));
, которая инкапсулирует логику для обработки параметров имени файла после getopt()
. Он должен обрабатывать -
в качестве стандартного ввода. Обратите внимание, что использование этого будет означать, что op_mode
должно быть переменной статического файла. Функция filter()
принимает argc
, argv
, optind
и указатель на функцию обработки. Он должен вернуть 0 (EXIT_SUCCESS), если он смог открыть все файлы и все вызовы функции 0, иначе 1 (или EXIT_FAILURE). Наличие такой функции упрощает запись программ «фильтра» в стиле Unix, которые читают файлы, указанные в командной строке или стандартном вводе.
Я очень удивлен, что никто не поднял пакет «opt» Джеймса Тейлера.
Вы можете выбрать http://public.lanl.gov/jt/Software/
и лестное сообщение с некоторыми примерами того, как это намного проще, чем другие подходы:
Я нашел Gengetopt очень полезным - вы указываете параметры, которые хотите с помощью простого файла конфигурации, и генерируете пару .c / .h, которую вы просто включаете и связываете с вашим заявление. Сгенерированный код использует getopt_long, похоже, обрабатывает наиболее распространенные виды параметров командной строки, и это может сэкономить много времени.
Входной файл gengetopt может выглядеть примерно так:
version "0.1"
package "myApp"
purpose "Does something useful."
# Options
option "filename" f "Input filename" string required
option "verbose" v "Increase program verbosity" flag off
option "id" i "Data ID" int required
option "value" r "Data value" multiple(1-) int optional
Генерация кода проста и выплевывается cmdline.h
и cmdline.c
:
$ gengetopt --input=myApp.cmdline --include-getopt
Сгенерированный код легко интегрируется:
#include <stdio.h>
#include "cmdline.h"
int main(int argc, char ** argv) {
struct gengetopt_args_info ai;
if (cmdline_parser(argc, argv, &ai) != 0) {
exit(1);
}
printf("ai.filename_arg: %s\n", ai.filename_arg);
printf("ai.verbose_flag: %d\n", ai.verbose_flag);
printf("ai.id_arg: %d\n", ai.id_arg);
int i;
for (i = 0; i < ai.value_given; ++i) {
printf("ai.value_arg[%d]: %d\n", i, ai.value_arg[i]);
}
}
Если вы необходимо выполнить какую-либо дополнительную проверку (например, флаги обеспечения взаимно исключают), вы можете сделать это довольно легко с данными, хранящимися в структуре gengetopt_args_info
.
#include
, а не в сгенерированный файл. мне отключить предупреждения verboten i> :-)
– cat
3 October 2016 в 20:28
Хорошо, это начало длинной истории - сделано короткое «bort parsing командной строки в C ...
/**
* Helper function to parse the command line
* @param argc Argument Counter
* @param argv Argument Vector
* @param prog Program Instance Reference to fill with options
*/
bool parseCommandLine(int argc, char* argv[], DuplicateFileHardLinker* prog) {
bool pathAdded = false;
// iterate over all arguments...
for ( int i = 1; i<argc; i++ ) {
// is argv a command line option ?
if ( argv[i][0] == '-' || argv[i][0] == '/' ) {
// ~~~~~~ Optionally Cut that part vvvvvvvvvvvvv for sake of simplicity ~~~~~~~
// check for longer options
if ( stricmp( &argv[i][1], "NoFileName" ) == 0
|| strcmp( &argv[i][1], "q1" ) == 0 ) {
boNoFileNameLog = true;
} else if ( strcmp( &argv[i][1], "FuckNow?" ) == 0 ) {
logInfo( "SECRET FOUND: Well - wow I'm glad ya ask me.");
} else {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Now here comes the main thing:
//
// check for one char options
while ( char option = *++argv[i] ) {
switch ( option ) {
case '?':
// Show program usage
logInfo(L"Options:");
logInfo(L" /q\t>Quite mode");
logInfo(L" /v\t>Verbose mode");
logInfo(L" /d\t>Debug mode");
return false;
// Log options
case 'q':
setLogLevel(LOG_ERROR);
break;
case 'v':
setLogLevel(LOG_VERBOSE);
break;
case 'd':
setLogLevel(LOG_DEBUG);
break;
default:
logError(L"'%s' is an illegal command line option!"
" Use /? to see valid options!", option);
return false;
} // switch one-char-option
} //while one-char-options
} //else one vs longer options
} // if isArgAnOption
//
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ So that's it! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// What follows now is are some usefull extras...
//
else {
// the command line options seems to be a path...
WCHAR tmpPath[MAX_PATH_LENGTH];
mbstowcs(tmpPath, argv[i], sizeof(tmpPath));
// check if the path is existing!
//...
prog->addPath(tmpPath); //Comment or remove to get a working example
pathAdded = true;
}
}
// check for parameters
if ( !pathAdded ) {
logError("You need to specify at least one folder to process!\n"
"Use /? to see valid options!");
return false;
}
return true;
}
int main(int argc, char* argv[]) {
try {
// parse the command line
if ( !parseCommandLine(argc, argv, prog) ) {
return 1;
}
// I know that sample is just to show how the nicely parse commandline Arguments
// So Please excuse more nice useful C-glatter that follows now...
}
catch ( LPCWSTR err ) {
DWORD dwError = GetLastError();
if ( wcslen(err) > 0 ) {
if ( dwError != 0 ) {
logError(dwError, err);
}
else {
logError(err);
}
}
return 2;
}
}
#define LOG_ERROR 1
#define LOG_INFO 0
#define LOG_VERBOSE -1
#define LOG_DEBUG -2
/** Logging Level for the console output */
int logLevel = LOG_INFO;
void logError(LPCWSTR message, ...) {
va_list argp;
fwprintf(stderr, L"ERROR: ");
va_start(argp, message);
vfwprintf(stderr, message, argp);
va_end(argp);
fwprintf(stderr, L"\n");
}
void logInfo(LPCWSTR message, ...) {
if ( logLevel <= LOG_INFO ) {
va_list argp;
va_start(argp, message);
vwprintf(message, argp);
va_end(argp);
wprintf(L"\n");
}
}
Обратите внимание, что эта версия также поддерживает комбинирующие аргументы:« Вместо записи / h / s -> / hs также будет работать.
Извините за то, что вы публиковали n-й человек здесь, однако я не был доволен всеми автономными версиями, которые я видел здесь. Хорошо, что либцы прекрасны. Поэтому, я бы предпочел использовать parseer option libUCW, Arg или Getopt над самодельными.
Обратите внимание, что вы можете изменить:
*++argv[i]
-> (++argv*)[0]
более длинный, но загадочный, но все же cryptic.
Хорошо, давайте сломаем его: 1. argv [i] -> получить доступ к i-му элементу в поле указателя argv-char
Так приятно, что в C ## указатели «умерли» - долго живут указатели !!!
]#include <stdio.h>
int main(int argc, char **argv)
{
size_t i;
size_t filename_i = -1;
for (i = 0; i < argc; i++)
{
char const *option = argv[i];
if (option[0] == '-')
{
printf("I am a flagged option");
switch (option[1])
{
case 'a':
/*someting*/
break;
case 'b':
break;
case '-':
/* "--" -- the next argument will be a file.*/
filename_i = i;
i = i + 1;
break;
default:
printf("flag not recognised %s", option);
break;
}
}
else
{
printf("I am a positional argument");
}
/* At this point, if -- was specified, then filename_i contains the index
into argv that contains the filename. If -- was not specified, then filename_i will be -1*/
}
return 0;
}
getopt()
или getopt_long()
.
– Jonathan Leffler
10 March 2012 в 02:55
Я написал небольшую библиотеку, которая анализирует аргументы, похожие на POpt, с которыми у меня было несколько проблем, называемых XOpt . Использует разбор аргументов в стиле GNU и имеет очень похожий интерфейс с POpt.
Я использую его время от времени с большим успехом, и он работает практически где угодно.
Существует большая библиотека C libUCW общего назначения, которая включает в себя опциональный синтаксический анализ параметров командной строки и .
Библиотека также поставляется с хорошей документацией и включает в себя некоторые другие полезные материалы (быстрый ввод-вывод, структуры данных, распределители и т. д.), но это можно использовать отдельно.
#include <ucw/lib.h>
#include <ucw/opt.h>
int english;
int sugar;
int verbose;
char *tea_name;
static struct opt_section options = {
OPT_ITEMS {
OPT_HELP("A simple tea boiling console."),
OPT_HELP("Usage: teapot [options] name-of-the-tea"),
OPT_HELP(""),
OPT_HELP("Options:"),
OPT_HELP_OPTION,
OPT_BOOL('e', "english-style", english, 0, "\tEnglish style (with milk)"),
OPT_INT('s', "sugar", sugar, OPT_REQUIRED_VALUE, "<spoons>\tAmount of sugar (in teaspoons)"),
OPT_INC('v', "verbose", verbose, 0, "\tVerbose (the more -v, the more verbose)"),
OPT_STRING(OPT_POSITIONAL(1), NULL, tea_name, OPT_REQUIRED, ""),
OPT_END
}
};
int main(int argc, char **argv)
{
opt_parse(&options, argv+1);
return 0;
}