我使用 GNU GCC 编译器在CodeBlocks中使用C language
进行编程。我正在编写一个函数来创建一些Link List
组成的标记作为节点。例如,对于在文本文件下面:
main ( )
{
int a ;
int b ;
}
令牌的链接列表将是
main -> ( -> ) -> { -> int -> a -> ; -> int -> b -> ; -> }
分隔符是space
个字符。
然后我决定制作一些名为line
的其他链接列表。每行包含由空格分隔的连续标记,以;
字符结束。例如,在具有相关标记的同一文本文件中,行将为:
main ( ) { int a ; -> int b ;-> }
你在下面看到我的代码:
//including the related Header files
typedef struct token {
char *tok;
struct token *next;
int tp;
} token;
typedef struct line {
char *ls;
struct line *next;
int parent;
} line;
token *start;
line *lstart;
void addline (line * a);
void showline (void);
void setline (void);
int main (void ) {
int i = 0;
// the next 4 lines allocates some space for start(pointer of type token)
// and lstart(pointer of type line) as the first node in the link
// list.The first meaningful data of each type are stored in the nodes
// after the start and lstart node
start = (token *) malloc (sizeof (token));
start->next = NULL;
lstart = (line *) malloc (sizeof (line));
lstart->next = NULL;
FILE *p;
p = fopen ("sample.txt", "r+");
if (p == NULL) {
printf ("Can Not Open File");
exit (1);
}
//calling some fnuction for making link list of tokens from the text
//file
setline ();
showline ();
return 0;
}
// the relevant add functions which adds a new token or
// link list at the end of the list
void showline ()
{
line *p;
p = lstart->next;
while (p != NULL) {
printf ("%s\n", p->ls);
p = p->next;
}
}
void setline (void)
{
int parent;
token *p;
p = start->next;
line *q;
q = (line *) malloc (sizeof (line));
q->ls = NULL;
while (p != NULL) {
if (p == NULL) {
break;
}
q->ls = strdup (p->tok);
strcat (q->ls, " ");
p = p->next;
while ((p != NULL)) {
if (strcmp (p->tok, ";") == 0) {
strcat (q->ls, "; ");
p = p->next;
break;
}
strcat (q->ls, p->tok);
strcat (q->ls, " ");
p = p->next;
}
printf ("%s\n", q->ls);
addline (q);
q->ls = NULL;
}
}
我将一些数据存储在文本文件“sample.txt”中:
#include <something.h>
int a , b ;
main ( )
{
int a ;
int b ;
}
我预计行会正确生成但是当我调用showline()
函数时会发生奇怪的事情(使用此函数并且可以在main
中看到):在某些行中有一些奇怪的字符。例如,第二个ls
节点的line
预计为int b ;
但真正发生的是înt b ;
,其中通常的i
字符变成了î
1}}(一个奇怪的角色)。在使用弦乐时我犯了哪些错误?
答案 0 :(得分:3)
一个有问题的地方:
q->ls=strdup(p->tok);
strcat(q->ls," ");
strdup
函数仅为p->tok
分配足够的空间,在复制字符串后没有任何空格可以附加任何内容。所以调用strcat
当然会写出界限,你将有未定义的行为。
如果你想追加更多的字符,你需要自己分配(使用malloc
或calloc
)你需要的大小,然后手动复制初始字符串。