从命令行向main()传递参数我所理解的是argc的最小值为1,而argv [0]将始终具有程序名称及其路径.
如果在命令行提供了参数,那么argc的值将大于1,而argv [argc-1]的argv将具有这些参数.
argv [0]将是包含程序名称的字符串,如果不可用,则为空字符串.
现在,argv [0]如何以及何时可以使用空字符串?我的意思是程序名称及其路径将始终可用,所以什么时候它可以为空?
作家说"如果不可用"但是何时以及如何可能无法获得该计划名称?
我正在阅读C Primer Plus中关于命令行参数的一节argv,我很难理解这句话.
它说,
程序将命令行字符串存储在内存中,并将每个字符串的地址存储在指针数组中.该数组的地址存储在第二个参数中.按照惯例,
argv对于参数值,将调用指向指针的指针.
这是否意味着命令行字符串作为指向数组的指针数组存储在内存中char?
在任何C程序中,命令行参数argv[0]指向用于调用程序的名称.是否存在任何指向空字符串的情况""?
这种情况的示例代码片段将是一个很好的参考.
可能重复:
获取可执行文件的路径
我正在使用MinGW,gcc 4.4.3在Windows上编程.当我使用这样的main函数时:
int main(int argc, char* argv[]){
cout << "path is " << argv[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,我得到一个完整的路径:"C:/ dev/stuff/bin/Test".但是,当我在Linux上运行相同的应用程序时,我会得到某种相对路径:"bin/Test".这打破了我的申请!关于如何确保路径在两个系统上都是绝对的任何想法?
我通读了一些关于相对路径的主题,但我还是弄错了。我希望某人可以帮助我:)。我使用的是 Visual Studio 2013,Windows 7
我得到以下目录:
这是我的 .exe 文件 D:\uni\c++\ex5\msvc2013\ex5\Debug
这是我要读取的文件 D:\uni\c++\ex5\res\thehead.raw
打开文件的代码:
FILE* f;
f = fopen("..\\..\\..\\res\\thehead.raw", "rb");
if (f == NULL)
printf("FAIL!!");
Run Code Online (Sandbox Code Playgroud)
因为我需要使用相对路径,所以我想通如下:..\ 到达父目录。
所以“..\..\..\”应该让我进入文件夹“D:\uni\c++\ex5\”。
\res 应该打开 res 文件夹。
不用说它失败了,我不知道为什么。任何帮助,将不胜感激。
我一直在修改Caffe深度学习库中的示例C++程序,我注意到第234行的代码似乎没有被再次引用.
::google::InitGoogleLogging(argv[0]);
Run Code Online (Sandbox Code Playgroud)
提供的参数是一个prototxt文件,它定义了我正在调用的深度学习模型的参数.令我困惑的是这条线的结果出在哪里?我知道他们最终被用在程序中,因为如果我在prototxt文件中出错,那么程序将崩溃.但是我很难看到如何将数据传递给执行分类任务的类.
假设源代码文件名是test.cpp.编译时,它会生成test.exe文件.当我执行它时,它应该识别它的文件名test.exe并打印它.
我可以使用以下代码获取当前目录中存在的所有文件和目录的列表:
DIR * directory;
struct dirent * direct;
direct = readdir(directory);
Run Code Online (Sandbox Code Playgroud)
但是,如何识别相关的文件名,在这种情况下是哪个"test.exe"?
可能重复:
如何在C中查找可执行文件的位置
我正在使用GTK +在C++中编写一个多平台应用程序,我遇到了问题.我必须得到程序路径.例如,当节目在/home/user/program(或C:\Users\user\program.exe)时,我有/home/user/(或C:\Users\user\).
可以以及如何做到这一点?
这是一些示例代码,用于了解我想要的内容.
int regular_function(void)
{
int x,y,z;
/** do some stuff **/
my_api_call();
return x;
}
...
void my_api_call(void)
{
char* caller = get_caller_file();
int line = get_caller_line();
printf("I was called from %s:%d\n", caller, line);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现get_caller_file()和get_caller_line()?我见过/使用技巧,例如#define荷兰国际集团my_api_call作为一个函数调用传入__FILE__和__LINE__宏.我想知道是否有办法在运行时而不是编译时访问该信息(假设它存在)?像Valgrind这样的东西是不是必须做这样的事情才能获得它返回的信息?
根据exec引用,对exec(或一般的堆栈检查vararg函数)的调用在(char*)NULL参数列表的末尾需要一个aka 0.然而,海湾合作委员会抱怨以下代码
char cmdFullPath[4096]; //yes this 4096 thing is bad coding practice
...
execl(cmdFullPath, (char*)NULL);
//warning: not enough variable arguments to fit a sentinel
Run Code Online (Sandbox Code Playgroud)
谁知道什么是错的?
我只是为了好玩而运行以下内容,但无法解释结果.假设./test WTF?是在命令行运行,产生的输出是
WTF? 6 2.为什么报告的argc值(2 - 正如预期的)和strlen(*argv)之间存在如此巨大的差异,后者变为6.我知道字符串数组并不是strlen正在寻找的,但是,我认为它产生的价值(如果产生任何东西)将合理地接近argc.思考?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char**argv)
{
for (int i = 1; i < argc; i++)
{
for (int j = 0; j < strlen(argv[i]); j++)
{
printf("%c", argv[i][j]);
}
printf(" ");
}
printf("\t%lu\t%d", strlen(*argv), argc);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud) 我正在编写将文本附加到文件的代码。它fopen在开头使用,WriteToFile因此即使文件不存在,它也会创建它。
但是,当我根本没有输入文件时会发生什么?根本没有争论?只是./a.out?
分段故障。
我不知道为什么,在我看来,我所做的一切都很好,以避免出现任何问题。
int main(int argc, char **argv)
{
char file_name[30] = "file.txt";
printf("%s",file_name); /* for debugging : doesn't print it */
if (0 != argc)
{
strcpy(file_name, argv[1]);
}
WriteToFile(file_name);
}
Run Code Online (Sandbox Code Playgroud)
或者(以防我真的无法将字符串文字放入 char 数组中):
char file_name[30];
if (0 == argc)
{
strcpy(file_name, "file.txt");
}
else
{
strcpy(file_name, argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
对于我得到的两种情况
Segmentation fault (core dumped)