C在名称文件后添加一些单词

时间:2014-08-15 23:56:16

标签: c pointers

void compressione(FILE* iDizionario, FILE* posizioneCorrente, FILE* iCorrispondenza, char* argv) {
    char* nomeFile;
    nomeFile = (char*)malloc( (3+strlen(argv))*sizeof(char) );
    strcpy(nomeFile, argv);
    nomeFile[strlen(argv)+1] = '.';
    nomeFile[strlen(argv)+2] = 'g';
    nomeFile[strlen(argv)+3] = 'f';
    ...

简单:
argv是一个指向char的指针,它指向一个char数组“input.txt”

char* nomeFile

在argv指针大小的堆内存上占用一个空格,但是还有3个字节 之后我从argv复制到nomeFile,所以现在都有input.txt 现在(因为nomeFile指针多3个字节)在这3个字节中我想把'。','g'和'f'字符。
所以我的想法是:我正好在名称文件+ 1的末尾,我添加第一个字符,其他两个相同的逻辑。
但是没有发生任何...在调试模式下,nomeFile指针具有相同的字符串。

2 个答案:

答案 0 :(得分:4)

您没有为nomeFile中的尾随0字节留出空间。此字节不会由strlen()计算。由于数组索引从0开始,当您将第一个字符写入strlen(argv)+1时,您将在0字节后写入,因此添加从不显示。

应该是:

size_t len = strlen(argv);
nomeFile = (char*)malloc( (4+len)*sizeof(char) );
strcpy(nomeFile, argv);
nomeFile[len] = '.';
nomeFile[len+1] = 'g';
nomeFile[len+2] = 'f';
nomeFile[len+3] = 0;

继续致电strlen(argv)也是一个坏主意。这必须每次都在字符串中搜索0字节。我已将其称为一次并将其保存在变量中。它还使代码更具可读性,恕我直言。

您也可以使用strcat()

strcpy(nomeFile, argv);
strcat(nomeFile, ".gf");

答案 1 :(得分:0)

nomeFile作为char数组启动。 char数组的索引从0开始,因此strlen()+ 1在终止nul char之后添加你的第一个char。

nomeFile[strlen(argv)] = '.';
nomeFile[strlen(argv)+1] = 'g';
nomeFile[strlen(argv)+2] = 'f';

你需要一个新的终止nul char,因此,你需要将缓冲区增加一(nomeFile = (char*)malloc( (4+strlen(argv))*sizeof(char) );)并在末尾添加一个空字符

nomeFile[strlen(argv)+3] = 0;