如何以字节为单位获取字符串大小?
正如标题所暗示的,我的问题是如何在C
获取字符串的大小。 如果我在没有malloc
的函数中声明它(字符串),那么使用sizeof
是否malloc
? 或者,如果我已将其声明为指针? 如果我用malloc
初始化它会怎么样? 我想做一个详尽的回复。
你可以使用strlen 。 大小由终止空字符确定,因此传递的字符串应该是有效的。
如果你想得到内存缓冲区的大小,它包含你的字符串,你有指向它的指针:
- 如果它是动态数组(使用malloc创建),则无法获得它的大小,因为编译器不知道指针指向的是什么。 ( 检查一下 )
- 如果是静态数组,则可以使用
sizeof
来获取其大小。
如果您对动态和静态数组之间的差异感到困惑,请检查此项 。
使用strlen
获取以null结尾的字符串的长度。
sizeof
返回数组的长度而不是字符串。 如果它是一个指针( char *s
),而不是一个数组( char s[]
),它将无法工作,因为它将返回指针的大小(通常在32位系统上为4个字节)。 我相信数组将作为指针传递或返回,因此您将无法使用sizeof
来检查数组的大小。
因此, 只有当字符串跨越整个数组时 (例如char s[] = "stuff"
),将使用sizeof
作为静态定义的数组返回您想要的内容(并且更快,因为它不需要循环查找null-terminator)(如果最后一个字符是空终止符,则需要减去1)。 如果它没有跨越整个数组,它将不会返回您想要的内容。
所有这一切的替代方案实际上是存储字符串的大小。
虽然sizeof
适用于此特定类型的字符串:
char str[] = "content"; int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
如果str
是指针( sizeof
返回指针的大小,通常是4或8)或指定长度的数组( sizeof
将返回匹配指定长度的字节数,对于char类型相同),则不起作用。
只需使用strlen()
。
如果你使用sizeof()
那么char *str
和char str[]
将返回不同的答案。 char str[]
将返回字符串的长度(包括字符串终止符),而char *str
将返回指针的大小(根据编译器而不同)。
我喜欢用:
(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");
干杯! function: size_t strlen (const char *s)