我创建了一个代码,用于在文本文件找到单词" NEW DAY"然后使用特定名称保存文件。
首先,我使用File_Part1,File_Part2等等......但是,我想使用我正在阅读的文件第二行的前15个字符作为保存文件的名称。
例如,第二行写着: TAM 2000-03-07T14:53 ... 我只想使用 TAM 2000-03-07
问题在于sprintf函数适用于"%d","%c"但不适用于"%s"而且我不知道为什么。
我试图在之前打印变量,看看sprintf应该接收什么,它正在接收我想要的......
以下是代码:
int TAM_BUFFER = 75;
int filecounter=1, linecounter=1;
char fileoutputname[16];
int main(int argc, char *argv[]){
char buffer[TAM_BUFFER];
char buffer2[15];
FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;
sprintf(fileoutputname, "file_part%d.txt", filecounter);
saida = fopen(fileoutputname, "w");
if(arquivo != NULL){
while(fgets(buffer, TAM_BUFFER, arquivo)){
if(linecounter==2){
strncpy(buffer2,buffer,14);
}
if (strncmp(buffer,"NEWDAY",strlen("NEWDAY")) == 0){
fclose(saida);
linecounter = 1;
filecounter++;
printf("%s", buffer2);
sprintf(fileoutputname,"%s", buffer2);
saida = fopen(fileoutputname, "w");
if (!saida)
return 1;
}
fprintf(saida,"%s\n", buffer);
linecounter++;
}
}
fclose(saida);
return 0;
}
答案 0 :(得分:1)
如果源的长度超过您复制的字符数,strncpy
函数将不会添加字符串终止符,因此buffer2
可能不包含字符串终止符,并且当您将其视为已终止时字符串,你将有未定义的行为。
解决方案非常简单:手动添加终结器。
像
strncpy(buffer2,buffer,sizeof buffer2 - 1);
buffer2[sizeof buffer2 - 1] = '\0';