C无法向结构添加新元素
我有这样一个结构:C无法向结构添加新元素,c,struct,char,element,C,Struct,Char,Element,我有这样一个结构: 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(li
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
xxxx xxxx xxxx
程序正在打印:
xxxx xxxx xxxx
xxxx xxxx xxxx
就像第二行取代了第一行。
我不知道为什么,当我有一个int而不是char的结构时,它工作得很好。添加了下一个元素,打印效果很好,但当char*时,它的工作方式与我前面描述的一样
当我使用带有char*的struct时,如何向列表中添加新元素?我想您应该意识到strtok是在静态缓冲区上工作的 所以当你这样写的时候
pch = strtok(linia, ":# ");
while(pch != NULL)
{
if(flagaEtyk == 0)
{
if(licznik == 0)
nowy->etykieta = pch;
您正在将闪亮堆元素中的指针指定给一个字符串,该字符串将在下一行(linia)消失
wynik=fgets(linia,80,stdin)代码>
您需要做的是复制字符串,这可以使用strdup()完成
链接列表中的每个字符串都映射到linia[80]
的部分,这些部分在每行访问时都会被覆盖
一些strdup()
调用应该可以解决您的问题。请看,将源代码(变量和函数名、注释)完全用英语保存是有好处的。第二,事实上:它提高了你的英语水平,也提高了代码的可读性(除非你的英语真的很糟糕)。这是来自一位非英语母语人士,他认为在他的母语(德语)中包含标识符的代码看起来有点“破损”。@DevSolar同意——尽管,sofern(condition){…}widrigenfalls{…}
有一定的魅力。@DanielFischer:LOL。。。Perl的除非()
已经让我头疼了。但是“widrigenfalls”真是太棒了非常感谢您提供此解决方案。只是不要忘记在以后释放内存。strdup分配需要释放的内存。
nowy->etykieta = strdup(pch);