strlen返回错误的值

use*_*582 2 c strlen data-structures

我正在使用双向链表创建文本编辑器.这些是我的结构:

#define N 4
typedef struct node
{
    char data[N];
    int size;
    struct node* next;
    struct node* prev;
}node;

typedef struct text
{
    struct node* head;
    struct node* tail;
    int count;
    int size;
}text;
Run Code Online (Sandbox Code Playgroud)

这是我用来填充第一个节点的代码段.

void push_text (text * t, char * s)
{
    int i;
    int len = strlen(s);
    node *newnode, *nextnode, *head;

    newnode = create_node();
    t->count++;
    head = newnode;
    for (i=0; i<len; i++)
    {
        if (newnode->size < 4)
        {
            newnode->data[newnode->size] = s[i];
            newnode->size++;
        }
    .
    .
    .
Run Code Online (Sandbox Code Playgroud)

当我通过printf或通过调试器打印节点时,输出为4个字符长,正如预期的那样.请注意,我会在第一个节点填满后立即打印,因此问题在于这段代码.但是,当我使用时,strlen(newnode->data)我得到的输出为5.这导致我以后遇到很多问题.

这有什么不对?

Iha*_*imi 11

你没有复制nul终结符,交流字符串最后需要一个'\0',所以如果它有4个字符,它使用5个字节,最后一个'\0'不在你的循环中复制.

但是,您应该使用strcpy()而不是在循环中逐个复制它们的字节.

strlen()函数扫描字节,直到它找到'\0',所以缺少'\0'导致错误值!,这也是不在strlen()循环中调用的原因,这是一个非常常见的错误.


das*_*ght 6

您不能将四个字符的C字符串放入四元素数组中char,因为您需要空终止符.将所有声明更改data

char data[N+1];
Run Code Online (Sandbox Code Playgroud)

您还应该在表达式中使用N常量4来表示长度小于N(例如,newnode->size < N而不是newnode->size < 4).