2017-04-06 84 views
0

我是C新手,編寫代碼來幫助我進行數據分析。它的一部分打開預定的文件。strncpy fuctions生成錯誤的文件名

這段代碼給我的問題,我不明白爲什麼。

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


#define MAXLOGGERS 26 

// Declare the input files 
char inputfile[]; 
char inputfile_hum[MAXLOGGERS][8]; 

// Declare the output files 
char newfile[]; 
char newfile_hum[MAXLOGGERS][8]; 

int main() 
{ 
    int n = 2; 
    while (n > MAXLOGGERS) 
    { 
     printf("n error, n must be < %d: ", MAXLOGGERS); 
     scanf("%d", &n); 
    } 

    // Initialize the input and output file names 
    strncpy(inputfile_hum[1], "Ahum.csv", 8); 
    strncpy(inputfile_hum[2], "Bhum.csv", 8); 
    strncpy(newfile_hum[1], "Ahum.txt", 8); 
    strncpy(newfile_hum[2], "Bhum.txt", 8); 


    for (int i = 1; i < n + 1; i++) 
    { 

     strncpy(inputfile, inputfile_hum[i], 8); 

     FILE* file1 = fopen(inputfile, "r"); 
     // Safety check 
     while (file1 == NULL) 
     { 
      printf("\nError: %s == NULL\n", inputfile); 
      printf("\nPress enter to exit:"); 
      getchar(); 
      return 0; 
     } 

     strncpy(newfile, newfile_hum[i], 8); 

     FILE* file2 = fopen(newfile, "w"); 
     // Safety check 
     if (file2 == NULL) 
     { 
      printf("Error: file2 == NULL\n"); 
      getchar(); 
      return 0; 
     } 

     for (int c = fgetc(file1); c != EOF; c = fgetc(file1)) 
     { 
      fprintf(file2, "%c", c); 
     } 

     fclose(file1); 
     fclose(file2); 
    } 
// system("Ahum.txt"); 
// system("Bhum.txt"); 
} 

此代碼生成兩個文件,但不是名稱:

Ahum.txt 
Bhum.txt 

的文件被命名爲:

Ahum.txtv 
Bhum.txtv 

的原因,我在for循環,因爲N使用strncpy實際上將在稍後由用戶輸入。

謝謝你的時間!

+0

您需要9個空格內存來存儲8個字符,因爲需要額外的\ 0終止c字符串 –

回答

1

我在這裏看到至少三個問題。

第一個問題是你的字符數組對於你的字符串來說太小了。 「ahum.txt」等將需要9個字符。八爲實際文本再加一個爲空終止字符。

第二個問題是您已經將字符數組「newfile」和「inputfile」聲明爲空數組。這些也需要是一個能夠包含字符串的數字(至少9)。 幸運的是,沒有將程序空間中的內存覆蓋掉。

第三個也是最後一個問題是你使用strcpy()。 strncpy(dest,src,n)會將n個字符從src複製到dest,但如果n等於或小於src字符串的大小,它不會複製最終的null結束符字符。

從函數strncpy()手冊頁:https://linux.die.net/man/3/strncpy

的函數strncpy()函數...最多n SRC的字節被複制。 警告:如果src的前n個字節中沒有空字節,則 放置在dest中的字符串將不會以null結尾。

通常情況下,您想要做的是將目標緩衝區的大小減1以允許空字符。

例如: strncpy(dest,src,sizeof(dest) - 1); //假設dest是字符數組

+0

Thanx,現在它的工作! 但我宣佈大小爲8的字符數組的原因是因爲我也計算了0。實際上不是inputfile_hum [MAXLOGGERS] [8]有9個字符的空間嗎? [0]: 「A」, [1]: 「H」, [2]: 「U」, [3]: 「m」 個, [4]: 「」, [5] :「t」, [6]:「x」, [7]:「t」, [8]:「\ n」 –

+0

很好用。數組大小是實際大小,而不是最高索引的值。一個8的數組的索引從0到7.請注意是否有幫助 – MrJLP

+0

不幸的是,upvoting需要15個聲望! –

0

您的代碼有幾個問題。

  1. inputfile_hum,newfile_hum需要是字符串尾隨'\ 0'大一個字符。

    char inputfile_hum [MAXLOGGERS] [9]; ... char newfile_hum [MAXLOGGERS] [9];

  2. strncpy()函數預期的第一個參數是一個char *區域大到足以容納預期的結果,所以inputfile中[]和OUTPUTFILE []需要聲明:

    焦炭inputfile中[9]。 char outputfile [9];