我有一个程序,它需要一个文件路径和一部分文件名作为输入。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
char filename[3][50];
void main(int argc, char **argv)
{
int run;
run=atoi(argv[2]);
char *datapath=malloc(100*sizeof(char));
datapath=argv[1];
sprintf(filename[0], "%s/test1.run%i", datapath, run);
sprintf(filename[1], "%s/test2.run%i", datapath, run);
sprintf(filename[2], "%s/test3.run%i", datapath, run);
}
但结果文件名分为两个字符串。一个包含
Name : filename
Details:{"/home/test/data", "/test.run1", '\0' <repeats 74 times>, '\0' <repeats 49 times>}
为什么?
答案 0 :(得分:3)
我没有看到问题。我稍微修改了你的代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
char filename[3][50];
void main(int argc, char **argv)
{
int run;
run=atoi(argv[2]);
char *datapath=argv[1];
sprintf(filename[0], "%s/test1.run%i", datapath, run);
sprintf(filename[1], "%s/test2.run%i", datapath, run);
sprintf(filename[2], "%s/test3.run%i", datapath, run);
printf("filename[0]=%s\n", filename[0]);
printf("filename[1]=%s\n", filename[1]);
printf("filename[2]=%s\n", filename[2]);
}
然后运行它:
$ gcc h.c -o h
$ ./h /home/test/data 1
filename[0]=/home/test/data/test1.run1
filename[1]=/home/test/data/test2.run1
filename[2]=/home/test/data/test3.run1
这是你的预期,对吧?
答案 1 :(得分:2)
您不能以这种方式复制字符串。
变化:
char *datapath=malloc(100*sizeof(char));
datapath=argv[1];
到
char *datapath = malloc(100); // don't cast malloc, and sizeof(char) is always 1
strcpy(datapath, argv[1]); /* datapath is writeable */
或
char *datapath = argv[1]; /* datapath is read only */
您可以查看c-faq
的“字符和字符串”部分答案 2 :(得分:0)
(我的文件路径比这个测试示例长得多)