如何在strcat中创建多个文本文件
就我而言,例如我输入了三个名字
./ test paul tony john,所以我用strcat添加“.dat”
但是我不能设置三个名字是paul.dat tony.dat john.dat
结果是paul.dat.dat.dat dat.dat.dat .dat.dat
int main(int argc, char *argv[]){
int pid, myid ,cid;
int num_name;
int i, n, returnpid;
int val;
num_name = argc-1;
for (i =1; i<=num_name; i++) {
strcat(argv[i],".dat");
}
答案 0 :(得分:2)
当你调用strcat()时,你需要确保为你想要添加的字符串的第一个参数分配了足够的空间。
您无法使用strcat()直接向argv []的元素添加内容。
为两个字符串(包括末尾的nul字符),strcpy()argv []元素分配一个足够大的新缓冲区,然后执行strcat()。
答案 1 :(得分:1)
您无法将".dat"
直接附加到argv[i]
,因为argv[i]
的分配大小只能保留其原始内容。
要了解发生了什么,想象argv
是这样的:
char buffer[] = "./test\0paul\0tony\0john\0";
char *argv[4] = { &buffer[0], &buffer[7], &buffer[12], &buffer[17] };
所以你可以看到,如果你在"paul"
之后写一些东西,你将覆盖"tony"
并打破整个事情,因为它们被序列化在同一个缓冲区中。
要解决此问题,您必须将每个argv[i]
复制到更大的缓冲区,以便安全地进行修改。例如:
int i;
char filename[1024];
for (i = 1; i < argc; ++i) {
sprintf(filename, "%s.dat", argv[i]);
// ... do stuff
}
然后,您将拥有一个包含所需文件名的变量filename
,而不会损坏argv
。
答案 2 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
int pid, myid ,cid;
int num_name;
int i, n, returnpid;
int val;
num_name = argc-1;
for (i =1; i<=num_name; i++) {
char *p;
p=(char*)malloc(sizeof(char)*(strlen(argv[i])+5));//5= 4(.dat) + 1(EOS)
sprintf(p, "%s.dat", argv[i]);
argv[i]=p;
}
for(i =1; i<=num_name; i++)
printf("%s\n", argv[i]);
return 0;
}