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).
我正在使用双向链表构建一个文本编辑器。这些是我的结构:
#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).