strlen 返回错误值

strlen returning wrong value

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

#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;

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

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++;
        }
    .
    .
    .

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

这是怎么回事?

您没有复制 nul 终止符,c 字符串末尾需要一个 '[=11=]',所以如果它有 4 个字符,它使用 5 个字节,最后一个是 '[=11=]'这不会在您的循环中复制。

然而,您应该使用 strcpy() 而不是在循环中一个一个地复制它们。

strlen() 函数扫描字节直到找到 '[=11=]',因此缺少 '[=11=]' 导致 错误值 !,这也是不在循环中调用 strlen() 的原因,这是一个非常常见的错误。

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

char data[N+1];

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

前面解释的答案都正确,但没有人解释错误。

举个例子你会更清楚错误

node.data[0] = 'a';
node.data[1] = 'b';
node.data[2] = 'c';
node.data[3] = 'd';
node.datasize = 4;

在小端机器中,内存将以这种方式填充:

十六进制值'a'、'b'、'c'、'd'编码为一个字节,四个字节编码为int

内存:'a''b''c''d'4000

那么你将获得...

strlen(node.data) --> 5
printf(node.data) --> abcd (plus 4 ascii code).