【问题标题】:what is the correct way to get strlen for a unsigned char *为 unsigned char * 获取 strlen 的正确方法是什么
【发布时间】:2012-06-14 01:18:51
【问题描述】:

我下面的代码为我期望的 unsigned char 指针提供了不同的长度。 我认为我应该为 pph 和 pphChar 获得 12(或 13)或 0(或 1)。 我的问题是什么?每次重复运行时,我得到的 length 和 oneLength 的结果都不同。

如何获取 pph 的长度?

是否需要在末尾加上“\n”来确定长度?

我使用 VS2010、XP 和 C++。

#include "stdafx.h"
#include <stdlib.h>
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

typedef unsigned char uint8_t;

int _tmain(int argc, _TCHAR* argv[])
{

int length;
int len = 13;
uint8_t *phh;
char * phhChar;

printf("assigned mem %d\n", sizeof(unsigned char)*len);
phh = (unsigned char *) malloc(sizeof(unsigned char)*len);
phhChar = (char *) malloc(sizeof(char)*len);

phh[0] = (unsigned char) '1';
phh[1] = (unsigned char) '2';
phh[2] = (unsigned char) '3';
phh[3] = (unsigned char) '4';
phh[4] = (unsigned char) '5';
phh[5] = (unsigned char) '6';
phh[6] = (unsigned char) '7';
phh[7] = (unsigned char) '8';
phh[8] = (unsigned char) '9';
phh[9] = (unsigned char) '0';
phh[10] = (unsigned char) '1';
phh[11] = (unsigned char) '2';
phh[12] = (unsigned char) '\n';

phhChar[0] = (char) '\n';

printf("size of char %d\n", sizeof(unsigned  char));
length =  strlen((const char*)phh);
int oneLength = strlen((const char*)phhChar);

printf("len %d\n", length );
printf("onelebgth %d\n", oneLength);

输出

分配的内存 13

字符 1 的大小

len 32 - 每次都不一样

oneLength 32 - 每次都不一样

【问题讨论】:

  • 您不会以零结尾的字符串,因此结果是随机的。
  • 顺便说一句,sizeof(char)sizeof(unsigned char) 保证为 1。
  • 可以用 C++ 编写 C,但这有点违背目的不是吗?

标签: c++ strlen unsigned-char


【解决方案1】:

您在字符串末尾缺少空终止符\0,因此strlen 无法知道unsigned char * 的结束位置。

实际上,它会在地址之后一直计数到您设置的最后一个字符,直到到达\0

【讨论】:

  • 谢谢。我将 \n 与 \0 混淆了。
【解决方案2】:

strlen 将根据终止字符计算长度,即 0 ('\0')。

两种情况相似:strlen 正在寻找 0,但您只指定 '\n' 作为“结尾”,它会读取该字符,直到找到终止 0,它可能会在不同的地方找到地方,取决于内存中包含的“垃圾”

处理未终止的字符串通常会导致分段错误,当读取过去的“字符串”访问尚未为项目分配的内存时,该错误将终止您的程序。

【讨论】:

  • 没有终止字符使它比预期的短。
  • @ChrisStratton - thx,在我意识到我将 OP 的 '0' 与终止 '\0' 混淆后,我已经改变了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多