C 如何获取以字节为单位的字符串大小?
正如标题所暗示的,我的问题是如何获得C 如何获取以字节为单位的字符串大小?,c,sizeof,arrays,C,Sizeof,Arrays,正如标题所暗示的,我的问题是如何获得C中字符串的大小。如果我在一个函数中声明了malloc,那么使用sizeof好吗?或者,如果我把它声明为指针?如果我用malloc初始化它呢?我希望得到详尽的回答。用于获取以空结尾的字符串的长度 sizeof返回数组的长度,而不是字符串的长度。如果它是指针(char*s),而不是数组(char s[]),它将不起作用,因为它将返回指针的大小(在32位系统上通常为4个字节)。我相信数组将作为指针传递或返回,因此您将无法使用sizeof检查数组的大小 因此,仅当字
C
中字符串的大小。如果我在一个函数中声明了malloc
,那么使用sizeof
好吗?或者,如果我把它声明为指针?如果我用malloc
初始化它呢?我希望得到详尽的回答。用于获取以空结尾的字符串的长度
sizeof
返回数组的长度,而不是字符串的长度。如果它是指针(char*s
),而不是数组(char s[]
),它将不起作用,因为它将返回指针的大小(在32位系统上通常为4个字节)。我相信数组将作为指针传递或返回,因此您将无法使用sizeof
检查数组的大小
因此,仅当字符串跨越整个数组时(例如char s[]=“stuff”
),使用sizeof
进行静态定义的数组将返回您想要的结果(并且速度更快,因为它不需要循环查找空终止符)(如果最后一个字符是空终止符,则需要减去1)。如果它不跨越整个数组,则不会返回所需的值
另一种方法是存储字符串的大小。您可以使用。大小由终止的空字符决定,因此传递的字符串应该是有效的
如果要获取包含字符串的内存缓冲区的大小,并且您有指向它的指针:
- 如果是动态数组(使用malloc创建),则无法获取 它的大小,因为编译器不知道指针指向什么。 ()
- 如果是静态数组,可以使用
获取其大小sizeof
如果您对动态数组和静态数组之间的差异感到困惑,请检查。,而
sizeof
适用于此特定类型的字符串:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
如果str
是指针(sizeof
返回指针的大小,通常为4或8)或具有指定长度的数组(sizeof
将返回与指定长度匹配的字节数,对于字符类型,这些字节数是相同的),则该函数不起作用
只需使用strlen()我喜欢使用:
(strlen(string) + 1 ) * sizeof(char)
这将为您提供以字节为单位的缓冲区大小。您可以将其与snprintf()一起使用,这可能会有帮助:
const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");
干杯!函数:
size\t strlen(const char*s)
如果使用sizeof()
则char*str
和char-str[]
将返回不同的答案。char-str[]
将返回字符串的长度(包括字符串终止符),而char*str
将返回指针的大小(根据编译器的不同而不同)。请注意,sizeof
实际上并没有给出字符串的长度。对于字符串文本,sizeof
包括空终止符。对于char
数组,sizeof
给出数组中的元素数(这是一个不可预测的量,大于数组内容的字符串长度)指出“<代码> StLLN 和strlen()+1
(1表示终止字符)@0x69字符串的大小通常定义为不包括空终止符。@ModifiableL值的含义是-不可能直接从动态数组中获取大小。当然可以存储大小,但这不是重点。@artaxerxe:C定义achar
为1字节,但不定义一个字节为8位。so、 虽然就C而言,char
确实始终是一个字节,但它不一定是一个八位字节,而且C标准之外的许多世界都认为“byte”意味着“八位字节”。字符大于8位的C实现是少数,但包括很多DSP。许多“可移植的”由于各种原因,代码不会在DSP上运行,因此您可以决定是否假设一个字节为8位。值CHAR\u BIT
肯定会告诉您。@Dukeling Hm…然后将strlen()
bytes withmemcpy
复制到其他(非空)缓冲区并打印它。您将看到的是新字符串+垃圾。这是我的论点,字符串大小(字节)是strlen()+1
(但是字符串长度是strlen()
)。在您的示例中,由于str是一个类型名,是否应该将其括起来?@ramrunnerstr
是变量名。它是一个数组,因此sizeof str
将返回整个数组的大小(以字节为单位)。当像上面那样声明数组时,数组大小正好是字符串文本的大小,包括终止'\0'
。和 sizeof
的优先级高于-
,因此sizeof str
不需要任何括号,尽管为了清晰起见在这里添加括号并不是一件坏事,我承认。(1)strlen()
总是返回以字节为单位的长度,将其乘以1不会增加任何内容;(2)缓冲区的大小和它包含的字符串的长度之间可能没有关系;(3)您是否尝试过编译这些代码?(1)没有乘以