这是我的代码。我需要使用以下格式创建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;
}
谢谢!
答案 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大小的缓冲区是个好主意。