【问题标题】:C cannot add new element to structC不能向结构添加新元素
【发布时间】:2013-01-21 09:55:02
【问题描述】:

我有这样的结构:

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;
}

现在,当我输入一行时: test test test 它运行良好并在控制台中打印测试测试。

但是当我输入更多行时,例如:

test test test
xxxx xxxx xxxx

程序正在打印:

xxxx xxxx xxxx
xxxx xxxx xxxx

就像第二行替换第一行一样。 我不知道为什么,当我有一个带有 int 而不是 char * 的结构时,它工作得很好。添加了下一个元素并且打印效果很好,但是当 char * 时,它的工作原理如上所述。

当我有带有 char * 的结构时,如何将新元素添加到列表中?

【问题讨论】:

  • 完全用英文保存您的源代码(变量和函数名称,cmets)是有好处的。二,实际上:它提高了您的英语,并提高了代码的可读性(除非您的英语真的很糟糕)。这是来自一位非英语母语人士,他认为包含其母语(德语)标识符的代码看起来有些“损坏”。
  • @DevSolar 同意 - 虽然,sofern (condition) { ... } widrigenfalls { ... } 有一定的魅力。
  • @DanielFischer:哈哈……Perl 的unless()已经让我头疼。但是“widrigenfalls”很棒。 ;-)

标签: c struct char element


【解决方案1】:

我认为你应该意识到 strtok 在静态缓冲区上工作

所以当你这样写

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

您正在将闪亮堆元素中的指针分配给将在下一行 (linia) 消失的字符串。

wynik = fgets(linia, 80, stdin);

你需要做的是复制字符串,这可以使用 strdup() 来完成

     nowy->etykieta = strdup(pch);

【讨论】:

  • 非常感谢这个解决方案。
  • 只是不要忘记之后释放内存。 strdup 分配需要释放的内存。
【解决方案2】:

链接列表中的每个字符串都映射到linia[80] 的一部分,在每行访问时都会被覆盖。

一些strdup() 电话应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多