0

如何在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");


    }
4

3 回答 3

2

当您调用 strcat() 时,您需要确保为您尝试添加的字符串的第一个参数分配的缓冲区中有足够的空间。

您不能使用 strcat() 将内容直接添加到 argv[] 的元素中。

为两个字符串分配一个足够大的新缓冲区(包括末尾的 nul 字符),strcpy() 将 argv[] 元素放入该缓冲区,然后执行 strcat()。

于 2013-03-30T18:28:52.373 回答
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.

于 2013-03-30T18:29:44.103 回答
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;
}
于 2013-03-30T20:22:26.150 回答