strncpy函数产生错误的文件名

时间:2017-04-06 22:16:10

标签: strncpy

我是C新手并编写代码来帮助我进行数据分析。部分内容打开了预定的文件。

这段代码给了我一些问题,我无法理解为什么。

#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循环中使用strncpy的原因是因为用户以后实际上会输入n。

2 个答案:

答案 0 :(得分:1)

我在这里至少看到三个问题。

第一个问题是你的字符数组太小而不适合你的字符串。 “ahum.txt”等需要取九个字符。八个用于实际文本,另外一个用于空终止字符。

第二个问题是你已经将字符数组“newfile”和“inputfile”声明为空数组。这些也需要是能够包含字符串的数字(至少9)。 你很幸运没有从程序空间中覆盖内存而崩溃。

第三个也是最后一个问题是你使用strcpy()。 strncpy(dest,src,n)会将src中的n个字符复制到dest,但如果n等于或小于src字符串的大小,它将不会复制最终的null终止符。

来自strncpy()联机帮助页:https://developers.facebook.com/docs/plugins/page-plugin#privacy

  

strncpy()函数...最多复制src的n个字节。   警告:如果src的前n个字节中没有空字节,   放在dest中的字符串不会以空值终止。

通常你想要做的是将“n”作为目标缓冲区的大小减去1以允许空字符。

例如:     strncpy(dest,src,sizeof(dest) - 1); //假设dest是char数组

答案 1 :(得分:0)

您的代码存在一些问题。

  1. inputfile_hum,newfile_hum,需要是一个更大的字符,用于尾随&#39; \ 0&#39;在字符串上。

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

  2. strncpy期望第一个参数是一个足以容纳预期结果的char *区域,因此需要声明inputfile []和outputfile []:

    char inputfile [9]; char outputfile [9];