strlen返回错误的值

时间:2015-05-26 13:14:27

标签: c data-structures strlen

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

Cond1 = Condition('test','==','test');
Cond2 = Condition(12,'>',13);
Cond3 = Condition(14,'<',13.6);
result1 = Cond1.Execute();
result2 = Cond2.Execute();
result3 = Cond3.Execute();

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

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

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

这里有什么问题?

3 个答案:

答案 0 :(得分:11)

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

但是,您应该使用strcpy()而不是逐个复制它们的字节。

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

答案 1 :(得分:6)

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

char data[N+1];

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

答案 2 :(得分:-1)

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

举个例子,你会看到更好的错误

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

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

&#39;&#39;&#39;&#39;&#39;&#39;&#39; d&#39;的十六进制值以字节和四个字节编码以编码int

记忆:&#39;&#39;&#39;&#39;&#39;&#39;&#39; 4000

然后你会得到......

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