练习7-1。编写一个程序,将大写字母转换为大写或小写字母,具体取决于调用它的名称,如argv [0]中所示。
对于那些有兴趣编写程序的人,可以在此处找到示例解决方案:http://users.powernet.co.uk/eton/kandr2/krx701.html
然而,我的问题是你如何调用该程序? argv [0]指的是程序的名称,但另外还有程序的文件路径。当我在argv [0]上执行printf()时,如果我通过我的代码:: blocks IDE运行程序,它将从/ home输出完整路径。如果我尝试通过命令行使用'./upper'(不带引号)执行程序,argv [0]在程序名称前包含'./'。
无论如何调用此程序而不将程序路径添加到PATH环境变量?
答案 0 :(得分:3)
您可以只扫描最后一个/
字符的字符串并使用该点上的所有字符吗?
答案 1 :(得分:2)
通常,argv[0]
将完全反映为您在命令提示符中键入的内容以执行该程序。如果您的程序出现在PATH
环境变量中包含的目录中,则您不必使用./
或完整路径指定目录名称。
但是,即使您的程序驻留在PATH
目录中,用户仍可以键入可执行文件的完整路径。你的程序应该准备好处理这个问题。
有关PATH
环境变量及其修改方法的详细信息,请参阅shell文档。
答案 2 :(得分:2)
您可以编译一次,无论输出文件名如何(例如:my_c_program
)和bash
,都可以使用:
$ exec -a upper ./my_c_program
foo
FOO
$ exec -a lower ./my_c_program
BAR
bar
如果您希望它在单独的shell中运行:
$ bash -c "exec -a upper ./my_c_program"
基本上,语法为exec -a <newname> <command>
,其中<newname>
为argv[0]
。
答案 3 :(得分:1)
您可以在execv(3)
周围编写一个小包装器,为您执行exec,参数设置恰到好处:
char *args = {"Uppercase", NULL};
execve("/path/to/your/Uppercase", args);
或者,您可以使您的程序更灵活地解析argv[0]
;如果给出目录部分,请参阅strrchr(3)
以获取程序名称的简便方法。