strncat添加了一些意想不到的字符

时间:2014-11-28 09:59:19

标签: c string concatenation

我正在尝试从目录中读取文件,并在其他目录中的“对应”文件中写入一些信息。为了获取新文件的路径和名称,我使用strncat函数连接了一些字符串。 我的问题是,strncat在一些字符串的开头添加一些字符,我不明白我做错了什么。

这是我的代码:

#define TRACES "../traces3/"
#define CSV "../csv/"

FILE* trace;
FILE* unite;
FILE* dizaine;

// Ouvre les fichiers de trace et de résultats
void ouverture (char* nom) {
    char* nTra;
    char* nUni;
    char* nDiz;
printf ("%s\n", CSV);

    nTra=malloc ((strlen (TRACES)+strlen (nom)+30)*sizeof (char));
    if (nTra==NULL) {
        printf ("Une erreure est survnue lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    strncat (nTra, TRACES, strlen (TRACES));
printf ("nTra : %s\n", nTra);
    strncat (nTra, nom, strlen (nom));

printf ("nTra : %s\n", nTra);

    nUni=malloc ((strlen (CSV)+strlen (nom)+30)*sizeof (char));
    if (nUni==NULL) {
        printf ("Une erreure est survnue lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    strncat (nUni, CSV, strlen (CSV));
printf ("nUni : %s\n", nUni);
    strncat (nUni, nom, strlen (nom)-3);
printf ("nUni : %s\n", nUni);
    strncat (nUni, "U.csv", 5);

printf ("nUni : %s\n", nUni);

    nDiz=malloc ((strlen (CSV)+strlen (nom)+30)*sizeof (char));
    if (nDiz==NULL) {
        printf ("Une erreure est survnue lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    strncat (nDiz, CSV, strlen (CSV));
printf ("nDiz : %s\n", nDiz);
    strncat (nDiz, nom, strlen (nom)-3);
printf ("nDiz : %s\n", nDiz);
    strncat (nDiz, "D.csv", 5);

printf ("nDiz : %s\n", nDiz);

    trace=fopen (nTra, "r");
    unite=fopen (nUni, "w");
    dizaine=fopen (nDiz, "w");

    free (nTra);
    free (nUni);
    free (nDiz);
}

以下是终端的结果:

nom :    red-queueS1D16.tr
../csv/
nTra : ../traces3/
nTra : ../traces3/red-queueS1D16.tr
nUni : ../csv/
nUni : ../csv/red-queueS1D16
nUni : ../csv/red-queueS1D16U.csv
nDiz : ../csv/
nDiz : ../csv/red-queueS1D16
nDiz : ../csv/red-queueS1D16D.csv
nom :    red-queueS2D16.tr
../csv/
nTra : ../traces3/
nTra : ../traces3/red-queueS2D16.tr
nUni : ��$../csv/
nUni : ��$../csv/red-queueS2D16
nUni : ��$../csv/red-queueS2D16U.csv
nDiz : ../csv/
nDiz : ../csv/red-queueS2D16
nDiz : ../csv/red-queueS2D16D.csv
nom :   red-queueS17D19.tr
../csv/
nTra : ../traces3/
nTra : ../traces3/red-queueS17D19.tr
nUni : а$../csv/
nUni : а$../csv/red-queueS17D19
nUni : а$../csv/red-queueS17D19U.csv
nDiz : ../csv/
nDiz : ../csv/red-queueS17D19
nDiz : ../csv/red-queueS17D19D.csv
nom :   red-queueS17D18.tr
../csv/
nTra : ../traces3/
nTra : ../traces3/red-queueS17D18.tr
nUni : ��$../csv/
nUni : ��$../csv/red-queueS17D18
nUni : ��$../csv/red-queueS17D18U.csv
nDiz : ../csv/
nDiz : ../csv/red-queueS17D18
nDiz : ../csv/red-queueS17D18D.csv
nom :    red-queueS3D21.tr
../csv/
nTra : ../traces3/
nTra : ../traces3/red-queueS3D21.tr
nUni : а$../csv/
nUni : а$../csv/red-queueS3D21
nUni : а$../csv/red-queueS3D21U.csv
nDiz : ../csv/
nDiz : ../csv/red-queueS3D21
nDiz : ../csv/red-queueS3D21D.csv

那么,是否有人可以帮助我?

感谢您的帮助;) 幻影

2 个答案:

答案 0 :(得分:0)

这一行

strncat (nTra, TRACES, strlen (TRACES));

strncat (nUni, CSV, strlen (CSV));

将CSV连接到您希望为空的未初始化字符串(即您希望它们已在第一个字节中初始化为0)。

您可以通过以下方式解决此问题:

strcpy(nTra, TRACES)

strcpy(nUni, CSV)

答案 1 :(得分:0)

使用snprintf()的示例:

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

#define TRACES "../traces3/"
#define CSV "../csv/"
#define UCSV "U.csv"
#define DCSV "D.csv"

FILE* trace;
FILE* unite;
FILE* dizaine;

// Ouvre les fichiers de trace et de résultats
void ouverture (char* nom) {
    char* nTra;
    char* nUni;
    char* nDiz;
    size_t nlen, tlen, clen, ulen,dlen, nlen3;
    int rc;

    nlen = strlen( nom);
    tlen = strlen( TRACES);
    clen = strlen( CSV);
    ulen = strlen( UCSV);
    dlen = strlen( DCSV);

printf ("%s\n", CSV);
    nlen3  = nlen > 3 ? nlen-3 :0;

    nTra=malloc (tlen+nlen+1);
    if (!nTra) {
        printf ("Une erreure est survenu lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    rc = snprintf( nTra, tlen+nlen+1, "%s%s", TRACES, nom );
        /* FIXME: Check return value `rc` here */
printf ("nTra : %s\n", nTra);

    nUni=malloc (clen+nlen+ulen+1);
    if (!nUni) {
        printf ("Une erreure est survenu lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    rc = snprintf(nUni, clen+nlen+ulen+1, "%s%s%s", CSV, nom, UCSV);
printf ("nUni : %s\n", nUni);

    nDiz=malloc (clen)+nlen+dlen+1;
    if (nDiz==NULL) {
        printf ("Une erreure est survenu lors d'une allocation mémoire\n");
        perror ("malloc");
        exit (0);
    }
    rc = snprintf(nDiz, clen+nlen+dlen+1, "%s%.*s%s", CSV, (int) nlen3, nom, DCSV);

printf ("nDiz : %s\n", nDiz);

#if 0
    trace=fopen (nTra, "r");
    unite=fopen (nUni, "w");
    dizaine=fopen (nDiz, "w");

    free (nTra);
    free (nUni);
    free (nDiz);
#endif
}

int main (void)
{
ouverture ("OMG!/");
return 0;
}

更新(添加nom的长度截断