为什么有些角色会改变?

时间:2016-01-16 06:09:29

标签: c string

我使用 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}}(一个奇怪的角色)。在使用弦乐时我犯了哪些错误?

1 个答案:

答案 0 :(得分:3)

一个有问题的地方:

q->ls=strdup(p->tok);
strcat(q->ls," ");

strdup函数仅为p->tok 分配足够的空间,在复制字符串后没有任何空格可以附加任何内容。所以调用strcat当然会写出界限,你将有未定义的行为

如果你想追加更多的字符,你需要自己分配(使用malloccalloc)你需要的大小,然后手动复制初始字符串。