您好,我正在尝试使用可执行文件的名称和用法字符串,我用于argv[0]此目的,但它不是可执行文件本身的名称,而是为我提供了它的完整路径。
有没有办法只获取可执行文件名称?
所以我有这样的代码
int main(int argc, char* argv[])
{
string outputUrl ;
string outputContainer ;
string outputUserName ;
for(int i = 0 i>=argc; i+2){
switch(argv[i]){ //C2450
case "-server" : {outputUrl += (argv[i+1]);} break; //C2051
case "-container" : {outputContainer = (argv[i+1]);} break; //C2051
case "-nickname" : {outputUserName += (argv[i+1]);} break; //C2051
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它给我编译器错误 C2450 和下一行 C2051?如何解决这样的问题?
c++ command-line command-line-arguments visual-studio-2008 visual-studio
假设有一个 C++ 代码,我使用以下命令编译成可执行文件:
g++ test.cpp -o testcpp
Run Code Online (Sandbox Code Playgroud)
我可以使用终端运行它(我使用的是 OS X),并提供一个用于在 C++ 程序内部处理的输入文件,例如:
./testcpp < input.txt
Run Code Online (Sandbox Code Playgroud)
我想知道从Haskell内部这样做是否可行。我听说过模块中的readProcess函数System.Process。但这仅允许运行系统 shell 命令。
这样做:
out <- readProcess "testcpp" [] "test.in"
Run Code Online (Sandbox Code Playgroud)
或者:
out <- readProcess "testcpp < test.in" [] ""
Run Code Online (Sandbox Code Playgroud)
或者:
out <- readProcess "./testcpp < test.in" [] ""
Run Code Online (Sandbox Code Playgroud)
抛出此错误(或非常相似的错误,具体取决于我使用的是上述哪一个):
testcpp: readProcess: runInteractiveProcess: exec: does not exist (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,Haskell 是否可以这样做。如果是这样,我应该如何使用以及使用哪些模块/功能?谢谢。
编辑
好的,正如大卫建议的那样,我删除了输入参数并尝试运行它。这样做有效:
out <- readProcess "./testcpp" [] ""
Run Code Online (Sandbox Code Playgroud)
但我仍然坚持提供输入。
我需要修改我的一个脚本。到目前为止,它有两个强制性参数,它们指出更新的版本和将应用此更新的数据库
./script.sh version db_name
Run Code Online (Sandbox Code Playgroud)
现在我想添加两个新的可选参数,实际上我应该将其称为开关。这些开关将其扩展为: 1. 在安装之前停止(或不停止)我的 Web 服务器 2. 还将一些新文件安装到文件系统 两者都返回 bool 值。所有细节都在脚本内。所以我期望类似的东西:
./script.sh version db_name -stopweb -copyfiles
Run Code Online (Sandbox Code Playgroud)
我发现getopts是合适的命令。问题是如何将参数(强制)和开关(可选)“连接”在一起。我真的不明白:(请你给我一些提示。
我试图在argparse. 但是,我有两个问题:
search(不是必需的)使用位置参数。理想情况下,我认为'search'是主要功能。因此,我希望它的参数是位置性的;虽然,search是不是必需的。但是,至少需要以下一项: search, --name, --list, --add, --import, --encrypt, --decrypt, --delete-database, --rename-database, --backup
另外,--name是不是相互排斥的选项,它是那种多用途:
-n myfirstdb --decrypt--name不存在,我假设最近访问的数据库。目前,我必须运行一个开始变得繁重的检查,以查看是否调用了任何主要选项,并测试是否--name存在。
最后,显然互斥的选项不能一起使用。
我怎样才能search成为这个必需的互斥群体的一部分?我怎样才能成为--name这个必需的组中的一个,但又不与其中任何一个互斥?
我正在试验子解析器,但我不确定它们是否能解决我的问题。任何建议都可能为我节省几天的反复试验时间,非常感谢。
parser.add_argument(
'search', nargs='*', type=str, metavar='S', help='search [field] for string(s)')
parser.add_argument(
'--name', '-n', type=str, help='name of the database; created if does not exist')
main_ex_group = parser.add_argument_group(
title='main functions').add_mutually_exclusive_group()
main_ex_group.add_argument(
'--list', '-l', action='store_true', help='list …Run Code Online (Sandbox Code Playgroud) python command-line command-line-arguments argparse python-3.x
我有这个程序,它只是打印出命令行参数。
echoArgs :: IO ()
echoArgs = do
line <- getArgs
print line
Run Code Online (Sandbox Code Playgroud)
我想知道的是为什么当我输入时会失败:
echoArgs :: IO ()
echoArgs = do
line <- getArgs
putStrLn line
Run Code Online (Sandbox Code Playgroud)
以及为什么当我将其更改为以下内容时它不起作用:
echoArgs :: IO String
echoArgs = do
line <- getArgs
let line' = read line :: String
putStrLn line'
Run Code Online (Sandbox Code Playgroud) 我必须检查它argv[1]是一个int,否则打印“错误”。
有小费吗?到目前为止,我所拥有的显然是不正确的。
int main(int argc, char *argv[])
{
if (argc == 2 && (int) argv[1] > 0)
{
printf("Hello, %s\n", argv[1]);
}
else
{
printf("ERROR\n");
return 1;
}
}
Run Code Online (Sandbox Code Playgroud) 我如何更改特定行的此文本
假设我想更改第 50 行,并且我想更改“user”之后的 8 个字母: 就像下面我加粗的例子
第 50 行“用户”:“ 9077c266 -8944-11eb-a9d1-fa163e4be1a2”
用 C 编写一个程序来计算从命令行传递的数字的阶乘。阶乘必须在一个名为 computeFact() 的单独函数中计算,该函数具有以下原型: int computeFact(int,…);
#include <stdarg.h>
#include <stdio.h>
#include<stdlib.h>
int computeFact(int, ...);
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Invalid!");
} else {
for (int i = 1; i < argc; i++)
{
int n = atoi(argv[i]);
printf("Factorial of %d is %d\n", n, computeFact(n));
}
}
printf("\n");./
return 0;
}
int computeFact(int num, ...)
{
va_list valist;
int fact = 1;
va_start(valist, num);
for (int i = 0; i < num; i++)
{ …Run Code Online (Sandbox Code Playgroud) 假设我有一个使用 make 安装的 python 项目。我希望无需先安装即可运行该项目。所以我创建了这个 make 规则:
run:
@echo "Running projectname"
@PYTHONPATH=${PYTHONPATH}:$(abs_srcdir)/..; ./projectname
Run Code Online (Sandbox Code Playgroud)
Where./projectname运行一个简单的 python 脚本来设置和运行项目,但这在这里并不重要。像这样,我可以简单地make run在项目的根文件夹中执行来执行和测试我的应用程序,它工作得很好。现在,我想将一些命令行参数传递给程序。我试过了make run --help,它只是打印了make帮助文本。运行make run -- --help打印
run:
@echo "Running projectname"
@PYTHONPATH=${PYTHONPATH}:$(abs_srcdir)/..; ./projectname
Run Code Online (Sandbox Code Playgroud)
应用程序运行,在我退出后,make尝试执行一个 target --help。
现在,我如何通过例如将--help参数传递给我的应用程序make?
command-line ×5
c ×3
haskell ×2
shell ×2
argparse ×1
arguments ×1
bash ×1
c++ ×1
do-notation ×1
executable ×1
io ×1
makefile ×1
monads ×1
optionparser ×1
python ×1
python-3.x ×1
sh ×1