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指针具有相同的字符串。
答案 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;