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