C++ 获取未签名字符的strlen的正确方法是什么*

C++ 获取未签名字符的strlen的正确方法是什么*,c++,strlen,unsigned-char,C++,Strlen,Unsigned Char,下面的代码为我期望的无符号字符指针提供了不同的长度。 我认为pph和pphChar应该得到12或13或0或1。 我有什么问题?每次重复跑步时,我得到的长度和长度结果都不一样 如何获得pph的长度 我是否需要在末尾加一个“\n”来确定长度 我使用VS2010、XP和C++。 #include "stdafx.h" #include <stdlib.h> #include <Windows.h> #include <stdio.h> #include <tc

下面的代码为我期望的无符号字符指针提供了不同的长度。 我认为pph和pphChar应该得到12或13或0或1。 我有什么问题?每次重复跑步时,我得到的长度和长度结果都不一样

如何获得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-每次都不同

字符串末尾缺少空终止符\0,因此strlen无法知道无符号字符*的结尾


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

字符串末尾缺少空终止符\0,因此strlen无法知道无符号字符*的结尾

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

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

这两种情况都是相似的:由于strlen正在查找0,但您只指定了“\n”作为结尾,因此它将读取该字符,直到找到终止的0为止,根据内存中包含的垃圾,它可能会在不同的位置找到该0

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

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

这两种情况都是相似的:由于strlen正在查找0,但您只指定了“\n”作为结尾,因此它将读取该字符,直到找到终止的0为止,根据内存中包含的垃圾,它可能会在不同的位置找到该0


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

您不会零终止字符串,因此结果是随机的。顺便说一句,SigeFochar和siZoFunchCar字符保证为1。你可以用C++编写C,但是这样的结果会失败。不是零终止字符串,所以结果是随机的。BTW,siZoFchar和siZoFun-Cuar字符被保证为1。你可以用C++编写C,但这有点违背了目的,不是吗?没有终止字符使其比预期的短。@ChrisStratton-thx,当我意识到将OP的“0”与终止字符“\0”混淆后,我也确实更改了答案。没有终止字符使其比预期的短。@ChrisStratton-thx,在我意识到将OP的“0”与终止的“\0”混淆后,我也确实更改了答案。谢谢。我把\n和\0混淆了。谢谢。我将\n与\0混淆。