连接文件名和文件路径,路径被拆分?

时间:2014-07-10 10:47:26

标签: c filepath string-concatenation

我有一个程序,它需要一个文件路径和一部分文件名作为输入。

#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>}

为什么?

3 个答案:

答案 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)

哦 - 我发现我分配的文件名太小了!我很抱歉这个愚蠢的问题!

(我的文件路径比这个测试示例长得多)