[英]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
终结符,ac字符串最后需要'\\0'
,所以如果它有4个字符则使用5个字节,最后一个是'\\0'
,它不会在你的循环中复制。
但是,您应该使用strcpy()
而不是在循环中逐个复制它们的字节。
strlen()
函数扫描字节,直到它找到'\\0'
,所以缺少'\\0'
导致错误的值 !,这也是不在循环中调用strlen()
的原因,这是一个非常常见的错误。
您不能将四个字符的C字符串放入char
的四元素数组中,因为您需要空终止符。 将所有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'000
然后你会得到......
strlen(node.data) --> 5
printf(node.data) --> abcd (plus 4 ascii code).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.