Char Array在操作时重置数据

时间:2015-07-20 08:08:48

标签: c++ c arrays char

我编写了一个简单的函数,它将带有扩展名的文件名,并返回扩展名和文件名减去扩展名。 它工作正常但是当我测试它时,我看到一些我的文件名被重置的地方。并非总是如此。

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

#define EXTENSION_STR_MAX           (16)
#define METADATA_STR_MAX                     (129)
struct meta_data_t 
{
    char filename[METADATA_STR_MAX];
    char fileextension[EXTENSION_STR_MAX];
};

void GetFileExtMetadata(const char* fileName, char* fileExt, char* updateFileName)
{
    // NULL Checks
    if((NULL == fileName) || (NULL == fileExt) || (NULL == updateFileName))
    {
        printf("NULL :-/  \n");
        return;
    }

    // Find the position of the last dot
    char * pch = NULL;
    pch = strrchr(fileName, '.');
    if((NULL == pch) || (fileName == pch)) 
    {
        printf("Nope\n");
    }
    else
    {
        // Copy ot the extension
        char fileextension[15];
        strncpy(fileextension, (pch+1),15);
        strcpy(fileExt, ".");
        strcat(fileExt, fileextension);

        // Remove the extension formthe filename
        *pch = '\0';
        strncpy(updateFileName, fileName, (METADATA_STR_MAX-1));
        updateFileName[METADATA_STR_MAX-1] = 0;
    }
}

int main()
{
    meta_data_t test1 = {};
    meta_data_t test2 = {};
    meta_data_t test3 = {};
    char tempfilename[METADATA_STR_MAX];

    strncpy(test1.filename, "Poker Face.mp3", (METADATA_STR_MAX-1));
    test1.filename[METADATA_STR_MAX-1] = 0;

    strncpy(test2.filename, "Love.is.in.the.air.wma is the ext", (METADATA_STR_MAX-1));
    test2.filename[METADATA_STR_MAX-1] = 0;

    strncpy(test3.filename, "Crazy.ThisisatesttoCheckLength", (METADATA_STR_MAX-1));
    test3.filename[METADATA_STR_MAX-1] = 0;

    printf("%s \n",test1.filename);
    printf("%s \n",test2.filename);
    printf("%s \n\n",test3.filename);   

    strncpy(tempfilename, test1.filename, (METADATA_STR_MAX-1));
    tempfilename[METADATA_STR_MAX-1] = 0;
    GetFileExtMetadata(tempfilename, test1.fileextension, test1.filename);

    printf(" BEFORE %s \n",test2.filename);
    strncpy(tempfilename, test2.filename, (METADATA_STR_MAX-1));
    tempfilename[METADATA_STR_MAX-1] = 0;
    GetFileExtMetadata(tempfilename, test2.fileextension, test2.filename);
    printf(" AFTER1 %s \n",test2.filename);

    strncpy(tempfilename, test3.filename, (METADATA_STR_MAX-1));
    tempfilename[METADATA_STR_MAX-1] = 0;
    GetFileExtMetadata(tempfilename, test3.fileextension, test3.filename);
    printf(" AFTER2 %s \n",test2.filename);  // NOT GOOD

    printf("%s - %s\n",test1.filename, test1.fileextension);
    printf("%s - %s\n",test2.filename, test2.fileextension);
    printf("%s - %s\n",test3.filename, test3.fileextension);

    printf("%s \n",test1.filename);
    printf("%s \n",test2.filename);
    printf("%s \n",test3.filename); 

    return 0;
}

结果:     扑克Face.mp3     Love.is.in.the.air.wma是分机     Crazy.ThisisatesttoCheckLength

 BEFORE Love.is.in.the.air.wma is the ext 
 AFTER1 Love.is.in.the.air 
 AFTER2  
Poker Face - .mp3
 - .wma is the ext
Crazy - .ThisisatesttoCh
Poker Face 

Crazy

我看到文件名Love.is.in.the.air在我第三次运行该函数后变空了。我无法理解为什么会这样。 任何线索? 感谢

2 个答案:

答案 0 :(得分:1)

用于保存文件扩展名的缓冲区是否过小?看起来它是16个字符(EXTENSION_STR_MAX),但是&#34; Love.is.in.the.air.wma&#34;不止于此。所以你得到了经典的缓冲区溢出。

答案 1 :(得分:0)

尝试调试一次代码,您就会找到答案。 并在将另一个字符串复制到其中之前重置“tempfilename”的内容。 安全编码。