在C中连接路径和变量

时间:2012-07-27 21:19:24

标签: c

这是我的代码。我需要使用以下格式创建10个文件:

0.txt
1.TXT
...

但是我不能这样做,结果是不同的。有人可以帮忙吗?

#include <stdlib.h>
#include <string.h>


char* direccion(char *dirD,int number){
    char buffer[100];
    char *n;
    char *q;
    char* formato=".txt";

    sprintf(buffer, "%i", number);
    n= strcat(dirD,buffer);
    q= strcat(n,formato);

    return q;

}
int main(){
    int u;
    int number= 0;
    int t= 0;
    char* q = "e:/c9/";
    for(t=0; t< 10 ; t++){

        char* dir = direccion(q,number);

            if(fopen(dir,"w")){
                fopen(dir,"w");
                u=1;
            }
            else{
                u=0;
                printf("Error\n");
            }
        number++;

    }
    return 0;
}

谢谢!

3 个答案:

答案 0 :(得分:3)

问题1:是:

char *q = "e:/c9/";
for(t = 0; t < 10; t++)
{
    char *dir = direccion(q, number);
}

变量q是字符串文字。但是,在函数direccion()中,将它作为第一个参数传递给strcat(),它试图修改它 - BOOM,一个段错误。解决方案:

char buf[1000];
strcpy(buf, "e:/c9/");
char *dir = direccion(buf, number);

问题#2就像@Charlie Martin指出的那样,你返回一个静态自动分配的本地字符串,在direccion()函数返回后该字符串无效。也许

return strdup(buffer);

在这种情况下;不要忘记在使用后将其释放。

编辑:似乎你甚至不问这个问题。您可以使用open()系统调用(函数)创建文件:

#include <fcntl.h>
#include <stdio.h>

int fd = open("file.txt", O_RDWR | O_CREAT, 0644);
close(fd);

当然,将所需的实际文件模式替换为0644(但不要使文件可执行,除非它包含要执行的程序)。

编辑2:我甚至没有抓到这个...所以,在for循环中,你想要反复重置基本文件名:

for (yadda yadda)
{
    strcpy(buf, "e:/c9/");
    char *dir = direccion(buf, i);
}

答案 1 :(得分:2)

您在函数内部自动分配缓冲区,这意味着它已在堆栈中分配。返回时,该内存不再有效。您希望在调用者中分配缓冲区并向其传递指针,或将其分配为静态。

答案 2 :(得分:0)

Windows具有一系列路径处理功能,您可以使用这些功能来添加路径扩展。  例如:

PathAddExtension(buffer,".txt");

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/bb773559(v=vs.85).aspx

此外,在处理路径时使用_MAX_PATH大小的缓冲区是个好主意。