K& R:练习7-1 - 我如何调用它?

时间:2011-12-18 05:35:13

标签: c invoke filepath

练习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环境变量?

4 个答案:

答案 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)以获取程序名称的简便方法。