gpt4 book ai didi

C 无法向结构添加新元素

转载 作者:行者123 更新时间:2023-11-30 17:55:20 25 4
gpt4 key购买 nike

我有这样的结构:

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 * 的结构时,如何将新元素添加到列表中?

最佳答案

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

所以当你这样写

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

您正在将 Shiny 堆元素中的指针分配给一个字符串,该字符串将在下一行(linia)处消失。

wynik = fgets(linia, 80, stdin);

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

     nowy->etykieta = strdup(pch);

关于C 无法向结构添加新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14436093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com