1

STDIN から次の行を読み取り、値を c に保存します。

A:2
B:3
C:AAAA1
C:AASC2
C:aade3
D:1
D:199

これが私のcプログラムです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#include <sys/time.h>

int main(int argc, char **argv)
{

    char buf[BUFSIZ];
    short a = 0;
    short b = 0;
    short anzb=0;
    short anza=0;
    char *c
    short *d;

    short i;


    while (fgets(buf, BUFSIZ, stdin) != NULL)
    {
        if (buf[strlen(buf)-1] == '\n') {
            char *isa = strstr(buf, "A:");
            char *isb = strstr(buf, "B:");
            char *isc = strstr(buf, "C:");
            char *isd = strstr(buf, "D:");
            if(isa){
                char *sep = substring(isa,3,strlen(isa));
                a = atoi(sep);
                d = malloc(a * sizeof(short));
            }else if(isb){
                char *sep = substring(isb,3,strlen(isb));
                b = atoi(sep);
                c = malloc(b * sizeof(char));
            }else if(isc){
                char *sep = substring(isc,3,strlen(isc));
                c[anzc] = sep;
                anzc++;
            }else if(isd){
                char *sep = substring(isd,3,strlen(isd));
                d[anzd] = sep;
                anzd++;
            }
        }
    }

    printf("%i\n", a);
    printf("%i\n", b);

    for(i=0; i<=anzc-1;i++){
        printf("%c", c[i]);
    }

    return 0;
}

私はCが初めてなので、ポインターと配列についてあまり知識がないので、助けていただければ幸いです。

値 A: と B: が読み取られて a に格納された後、bi は c と d の行の配列を作成できます。そして、ここに私の問題があると思います。この時点で、プログラムで配列を作成する方法がわかりません。私はmallocなどで試しましたが、私の知識は小さいです。

c と d (A と B) の値 (サイズ) を読み取った場合にのみ、その時点で配列を作成したいだけです。

そして、配列に値を保存したいと思います。

コードの修正にご協力いただければ幸いです。この日、私は多くのことを試みましたが、何もうまくいかず、今では非常に無力です.

編集:

セグメンテーション違反が発生する新しい試み 11:

     else if(isb){
        char *sep = substring(isb,8,strlen(isb));
        b = atoi(sep);
        c = malloc(b * sizeof(char*));
        int i;
        for (i = 0; i < subst; i++)
        {
          c[i] = malloc(13);
        }
    }else if(isc){
        char *sep = substring(isc,8,strlen(isc));
        strcpy(c[anzc], &buf[3]);
        anzc++;
    }
4

1 に答える 1

1

あなたの割り当ては多かれ少なかれ正しいですが、いくつかの詳細を見落としています。B は 3 の値を提供します。これは、それぞれの長さではなく、C に存在するエントリの数です。次に、実際には 2 次元配列が必要なときに単一の配列を割り当てました。char*この配列は、C 行の各値を含む 3 つの他の配列を指します。そう;

この行c = malloc(b * sizeof(char));は次のようにc = malloc(b * sizeof(char*)); する必要があります。

 int i;
 for (i = 0; i < b; i++)
 {
     c[i] = malloc(length); // where length is some arbitrary buffer length
     // because you have no way of knowing the length of the individual strings.
 }

strcpyこの後、 for ループで割り当てた各 char 配列に行をコピーするために使用できます。

したがって、コピーを完了するには、次のようなことを行う必要があります。

         int iC = 0;
         // outside of the while loop we need a control var track the index
         // of the c array. it needs to work independent of the normal iteration.
         //inside the while loop
         else if(isc){
            strcpy(c[iC], &buf[3]) 
            iC++;
        }
于 2013-04-23T15:54:42.017 に答える