我正在尝试从目录中读取文件,并在其他目录中的“对应”文件中写入一些信息。为了获取新文件的路径和名称,我使用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
那么,是否有人可以帮助我?
感谢您的帮助;) 幻影
答案 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
的长度截断