0

strcatで複数のテキストファイルを作成する方法

私の場合、たとえば、3つの名前を入力します

./test paul tony john ということで、strcat を使用して「.dat」を追加します。

しかし、私は 3 つの名前を設定できません。名前は 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[] の要素に直接追加することはできません。

両方の文字列 (末尾のヌル文字を含む) に十分な大きさの新しいバッファーを割り当て、そのバッファーに argv[] 要素を strcpy() してから、strcat() を実行します。

于 2013-03-30T18:28:52.373 に答える
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 に答える
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 に答える