2012-07-27 96 views
2

這是我的代碼。我需要創建10個文件,這種格式:C中的連接路徑和變量

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

這是在Windows下嗎? – 2012-07-27 21:34:06

+0

是的,僅在windows中。 – Sark 2012-07-27 21:39:51

回答

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馬丁指出的是,你返回靜態自動分配的本地字符串,這是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); 
} 

+0

WTF是代碼格式化程序在做什麼? – 2012-07-27 21:30:43

+0

不錯,但現在創建的文件: 0.txt,0.txt1.txt,0.txt1.txt2.txt等,如何解決這個問題? – Sark 2012-07-27 21:32:51

+0

@ user1558736請參閱更新。 – 2012-07-27 21:38:18

2

你在你的函數中自動分配緩衝區,這意味着它被分配到堆棧上。當您返回時,該內存不再有效。您想分配調用者中的緩衝區,並將指針傳遞給它,或將其分配爲靜態。