我写了一个小程序,从中获取一些输入参数*argv[]并打印它们.几乎在所有用例中,我的代码都运行得很好.只有在我想要作为参数传递的字符串末尾使用多个感叹号时才会出现问题...
这有效:
./program -m "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
这不起作用:
./program -m "Hello, world!!!!"
Run Code Online (Sandbox Code Playgroud)
^^如果我这样做,程序输出要么是该字符串的两倍,要么是我在./program之前输入的命令.
但是,我绝对不明白:以下,奇怪的是,它的工作原理:
./program -m 'Hello, world!!!!'
Run Code Online (Sandbox Code Playgroud)
^^输出正是......
Hello, world!!!!
Run Code Online (Sandbox Code Playgroud)
......正如所希望的那样.
所以,我的问题是:
""是字符串和''单个字符.那么为什么我在使用时会得到所需的结果'',而不是在""我应该使用时(根据我的理解)?我的代码的相关部分:
// this is a simplified example that, in essence, does the same
// as my (significantly longer) code
int main(int argc, char* argv[]) {
char *msg = (char *)calloc(1024, sizeof(char));
printf("%s", strcat(msg, argv[2])); // argv[1] is "-m"
free(msg);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试先将内容复制argv[2]到char*缓冲区中并附加一个缓冲区 …
argv全局使用指针是否安全?或者是否存在可能无效的情况?
即:这个代码安全吗?
char **largs;
void function_1()
{
printf("Argument 1: %s\r\n",largs[1]);
}
int main(int argc,char **argv)
{
largs = argv;
function_1();
return 1;
}
Run Code Online (Sandbox Code Playgroud) 我刚写了一个小程序,用C语言读取命令行参数,没什么太难的.我也在修改它们,例如将参数的第一个字符更改为大写.
我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]你不应该改变文字中的字符串.
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud) sys.argvPython 中的元素是什么编码?他们用sys.getdefaultencoding()编码编码?
sys.getdefaultencoding():返回Unicode实现使用的当前默认字符串编码的名称.
PS:正如一些答案所指出的那样,sys.stdin.encoding确实是一个更好的猜测.不过,我很想看到这个问题的确切答案,指出固体来源!
PPS:正如Wim所指出的,Python 3通过str在sys.argv中放置对象来解决这个问题(如果我理解的话).但问题仍然是Python 2.x的问题.在Unix下,LC_CTYPE环境变量似乎是正确的检查,不是吗?应该用Windows做什么(这样无论控制台如何都能正确解释sys.argv元素)?
这就是我们如何使用MPI_Init函数
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
Run Code Online (Sandbox Code Playgroud)
为什么MPI_Init使用指向argc和argv的指针而不是argv的值?
在C程序中,我可以编写argv [0],新名称显示在ps列表中.
我怎么能用bash做到这一点?
我熟悉C,并开始在python中进行实验.我的问题是关于sys.argv命令.我已经读过它用于命令行解释器,但是当我尝试执行一个简单的程序时,我没有得到我期望的结果.
码:
import sys
a = sys.argv[1]
b = sys.argv[2]
print a, b
print a+b
Run Code Online (Sandbox Code Playgroud)
输入:
python mySum.py 100 200
Run Code Online (Sandbox Code Playgroud)
输出:
100 200
100200
Run Code Online (Sandbox Code Playgroud)
当我添加两个参数时,它们被连接而不是两个值被加在一起.似乎这些值被视为字符串.
我怎样才能将它们解释为数字?
代码1
#include<stdio.h>
int main(int argc, char *argv[])
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码2
#include<stdio.h>
int main(int argc, char **argv)
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CODE 1和CODE 2都提供相同的输出.但是CODE 1和CODE 2中主要功能的参数2是不同的.在编译时在数据部分上创建指针数组.argv是指针数组.然后我们应该在main函数中声明参数作为指向字符的指针,即**argv.在CODE 1中声明如何正确?
受到另一个问题的启发,我想以便携方式检索Python解释器的完整命令行.也就是说,我想原来argv解释的,而不是sys.argv不包括选项来解释本身(如-m,-O等).
sys.flags告诉我们设置了哪些布尔选项,但它没有告诉我们有关-m参数的信息,并且标志集必然会随着时间的推移而发生变化,从而产生维护负担.
在Linux上,您可以使用procfs来检索原始命令行,但这不是可移植的(并且它有点粗略):
open('/proc/{}/cmdline'.format(os.getpid())).read().split('\0')
Run Code Online (Sandbox Code Playgroud) 我一直在整个文档,似乎没有办法做到这一点,但是:
有没有办法将argparse与任何字符串列表一起使用,而不是仅使用sys.argv?
这是我的问题:我有一个看起来像这样的程序:
# This file is program1.py
import argparse
def main(argv):
parser = argparse.ArgumentParser()
# Do some argument parsing
if __name__ == '__main__':
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
从命令行直接调用此程序时,此方法正常.但是,我有另一个python脚本,它使用不同的命令行参数运行此脚本的批处理版本,我正在使用这样:
import program1
arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)
Run Code Online (Sandbox Code Playgroud)
我仍然希望能够解析参数,但argparse自动默认使用sys.argv而不是我给它的参数.有没有办法传入参数列表而不是使用sys.argv?