我正在尝试为程序打开txt文件,并输入文件名作为命令行参数。如果我将路径作为字符串提供,那么它可以工作,因此我的代码中的问题出在命令行参数上。我有以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[])
{
char* filename = "/path/";
char* name = argv[1];
printf("%s\n", filename);
printf("%s\n", name);
strcat(filename, name);
printf("%s\n", filename);
strcat(filename, ".txt");
printf("%s\n", filename);
return 0;
}
我这样运行:
./program filenamewithoutextension
运行它会得到以下输出:
/path/
filenamewithoutextension
Segmentation fault (core dumped)
我不知道发生了什么。
答案 0 :(得分:1)
请注意,在代码段中,filename
和name
只是指向只读数据的指针,因此您不能修改它们指向的数据。
您可以使用malloc
动态分配内存,以便能够编辑它们指向的数据。或者只是为它们像filename[100]
或name[100]
这样的堆栈分配内存。
您的代码应为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[])
{
char filename[100];
char name[100];
strcpy(filename, "/path/");
strcpy(name, argv[1]);
printf("%s\n", filename);
printf("%s\n", name);
strcat(filename, name);//You can safely modify name now
printf("%s\n", filename);
strcat(filename, ".txt");//You can safely modify filename now
printf("%s\n", filename);
return 0;
}
答案 1 :(得分:0)
char* filename = "/path/";
仍被C语言接受,以考虑编写的旧代码
在早期,const
关键字还不存在。
但这应该是const char *
,因为"/path/"
实际上是一个常数
字符串。
(-Wwrite-strings
编译器选项可以帮助检测到这一点)
如果要在此字符串后附加内容,则需要更多存储空间
跟随字符。
char filename[100]="/path/";
在这种情况下,100个字符对于您的函数而言是本地的,可以更改。
它们以给定的字符开头,但后跟许多零(最多100个)。
然后,在最后一个/
之后放置一些新字符是有意义的。