0

私はそのような構造を持っています:

typedef struct kodProgramu {
    char* etykieta;
    char* instrukcja;
    char* operand;
    struct kodProgramu *nast;
} kodPrg;

このコードは、新しい要素を追加するためのものです:

void pobierzKodStdin(kodPrg *kod, char *wynik, char *linia, int flagaEtyk)
{
    wynik = fgets(linia, 80, stdin);
    while(wynik != NULL)
    {
        kodPrg *wsk, *nowy;
        wsk = kod;
        while(wsk->nast != NULL)
            wsk = wsk->nast;

        if(linia[0] == ' ')
            flagaEtyk = 1;

        nowy = (kodPrg*)malloc(sizeof(kodPrg));
        int licznik = 0;
        char *pch;
        pch = strtok(linia, ":# ");
        while(pch != NULL)
        {
            if(flagaEtyk == 0)
            {
                if(licznik == 0)
                    nowy->etykieta = pch;
                else if(licznik == 1)
                    nowy->instrukcja = pch;
                else if(licznik == 2)
                    nowy->operand = pch;
            }
            if(flagaEtyk == 1)
            {
                if(licznik == 0)
                    nowy->instrukcja = pch;
                else if(licznik == 1)
                    nowy->operand = pch;
            }

            licznik++;
            pch = strtok(NULL, ":# ");
        }
        nowy->nast = NULL;
        wsk->nast = nowy;

        flagaEtyk = 0;
        wynik = fgets(linia, 80, stdin);
    }
}

この関数は、この構造をコンソールに出力します。

void wypiszKod(kodPrg *kod)
{
    kodPrg *wsk = kod;
    while(wsk != NULL)
    {
        printf("%s %s %s\n", wsk->etykieta, wsk->instrukcja, wsk->operand);
        wsk = wsk->nast;
    }
}

これが私の主な機能です:

int main()
{
    char linia[80], *wynik;
    char *wsk = malloc(sizeof(char));
    int flagaEtyk = 0;
    //tasmaWejsc *wejscie = (tasmaWejsc*)malloc(sizeof(tasmaWejsc));
    //tasmaWyjsc *wyjscie = (tasmaWyjsc*)malloc(sizeof(tasmaWyjsc));
    //wyjscie->wartosc = 0;
    //wyjscie->nast = NULL;
    kodPrg *kod = (kodPrg*)malloc(sizeof(kodPrg));
    kod->etykieta = " ";
    kod->instrukcja = " ";
    kod->operand = " ";
    kod->nast = NULL;
    int liczba;

    //wprowadzWejscie(wynik, linia, wejscie);
    //wypiszWejscie(wejscie);

    //system("cls");

    pobierzKodStdin(kod, wynik, linia, flagaEtyk);
    wypiszKod(kod);

    return 0;
}

ここで、次のような 1 行を入力すると、test test test 正常に動作し、test test test がコンソールに出力されます。

しかし、さらに行を入力すると、たとえば次のようになります。

test test test
xxxx xxxx xxxx

プログラムは印刷中です:

xxxx xxxx xxxx
xxxx xxxx xxxx

2行目が最初の行を置き換えるようなものです。char * の代わりに int を使用した構造体がある場合、理由はわかりません。うまく機能しています。次の要素が追加され、印刷は良好ですが、 char * の場合は上記のように機能します。

char * の構造体がある場合に、新しい要素をリストに追加するにはどうすればよいですか?

4

2 に答える 2

0

strtokは静的バッファで動作することを理解する必要があると思います

だからあなたがこのように書くとき

pch = strtok(linia, ":# ");
while(pch != NULL)
{
  if(flagaEtyk == 0)
  {
     if(licznik == 0)
     nowy->etykieta = pch;

光沢のあるヒープ要素のポインタを、次の行(リニア)で消える文字列に割り当てています。

wynik = fgets(linia, 80, stdin);

あなたがする必要があるのは文字列のコピーを作ることです、これはstrdup()を使って行うことができます

     nowy->etykieta = strdup(pch);
于 2013-01-21T10:03:09.170 に答える
0

リンク リスト内のすべての文字列は の部分にマップされlinia[80]、各行にアクセスするたびに上書きされます。

一部のstrdup()呼び出しで問題が解決するはずです。

于 2013-01-21T10:08:34.470 に答える