2

这是我的代码。我需要用这种格式创建 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;
}

谢谢 !

4

3 回答 3

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);
}

等等

于 2012-07-27T21:24:17.177 回答
2

您在函数内部自动分配缓冲区,这意味着它是在堆栈上分配的。当您返回时,该记忆不再有效。您想在调用者中分配缓冲区并将指针传递给它,或者将其分配为静态。

于 2012-07-27T21:21:23.093 回答
0

Windows 有一系列路径处理函数,您可以使用它们来执行诸如向路径添加扩展名之类的操作。例如:

PathAddExtension(buffer,".txt");

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

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

于 2012-07-27T21:59:38.390 回答