作为标题所示,我的问题是如何在C语言中获取字符串的大小。如果我在一个没有使用malloc的函数中声明了它(字符串),使用sizeof是否好?或者,如果我将其声明为指针呢?如果我使用malloc进行初始化会怎样?我希望得到详尽的回答。
sizeof
来获取它的大小。strlen
获取以null结尾的字符串的长度。
sizeof
返回的是数组的长度,而不是字符串的长度。如果它是一个指针(char *s
),而不是一个数组(char s[]
),它将不起作用,因为它将返回指针的大小(在32位系统上通常为4个字节)。我相信数组将作为指针传递或返回,因此您将失去使用sizeof
检查数组大小的能力。char s[] =“stuff”
),使用sizeof
来获取静态定义数组将返回您想要的内容(并且会更快,因为它不需要循环查找null终止符)(如果最后一个字符是null终止符,则需要减去1)。如果它没有跨越整个数组,它将无法返回您想要的内容。sizeof
并不能真正给你字符串的长度。对于字符串字面值,sizeof
包括空终止符。对于一个 char
类型的数组,sizeof
给出数组中元素的数量(这个数量比数组内容字符串的长度大得不可预测)。 - simoncstrlen
和sizeof
返回两个根本不同的东西可能是有意义的。 - alk虽然 sizeof
可以用于这种特定类型的字符串:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
str
是指针(sizeof
返回指针的大小,通常为4或8),或者是具有指定长度的数组( sizeof
将返回与指定长度相匹配的字节数,对于char类型来说是相同的),那么它不起作用。strlen()
即可。str
是变量名。它是一个数组,因此sizeof str
将以字节为单位返回整个数组的大小。当像上面那样声明数组时,数组大小正好是包括终止符'\0'
在内的字符串文字的大小。而sizeof
比-
的优先级更高,因此sizeof str
不需要任何括号,尽管在这里添加括号以增加清晰度并不是一件坏事,我承认。 - hyde sizeof()
,那么 char * str
和 char str []
将返回不同的答案。 char str []
将返回字符串的长度(包括字符串终止符),而 char * str
将返回指针的大小(根据编译器而异)。我喜欢使用:
(strlen(string) + 1 ) * sizeof(char)
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)
strlen()
总是返回字节长度,乘以1不会增加任何东西;
(2) 缓冲区的大小与其包含的字符串长度之间可能没有关系;
(3) 你尝试编译过这些代码吗? - Crowmanstrlen()
并给出了一些有意义的解释,而这个答案并不值得点赞。 - Crowman1/2
始终为零。请停止浪费我的时间。 - Crowman找到字符串大小字节有两种方法:
第一种解决方案:
# include <iostream>
# include <cctype>
# include <cstring>
using namespace std;
int main()
{
char str[] = {"A lonely day."};
cout<<"The string bytes for str[] is: "<<strlen(str);
return 0;
}
第二种解决方案:
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
char str[] = {"A lonely day."};
cout<<"The string bytes for str[] is: "<<sizeof(str);
return 0;
}
strlen
,基于cplusplus.com,
这可以解释为什么第一个解决方案输出正确的字符串大小字节,而第二个解决方案输出错误的字符串大小字节。但如果您还是不明白,请继续阅读。C字符串的长度由终止空字符决定: 一个C字符串的长度是从字符串开头到终止空字符的字符数(不包括终止空字符本身)。
sizeof
来查找字符串大小字节。根据this SO答案,它说(进行修改):
这就是为什么输出的字符串大小是14个字节。一个是整个字符串,另一个是'\0'。
sizeof("f")
必须返回 2 个字符串大小字节,一个用于 'f',另一个用于终止符 '\0' (终止空字符)。
sizeof(str)-1
。
参考文献:
strlen()+1
(1代表终止字符)。 - Agnius Vasiliauskaschar
占1个字节,但它没有定义一个字节是8个比特。因此,虽然对于C语言来说,“char”始终是一个字节,但它不一定是一个八位字节,而且在C标准之外的很多地方,“字节”意味着“八位字节”。虽然在char
大于8位的C实现中是少数,但其中包括许多DSP。出于各种原因,许多“可移植”的代码无论如何都不能在DSP上运行,因此你需要决定是否假定一个字节是8个比特。用值CHAR_BIT
可以确定这一点。 - Steve Jessopmemcpy
将strlen()
字节复制到另一个(非空)缓冲区并打印它。你会看到的是你的新字符串+垃圾。这对我来说是字符串大小为strlen()+1
的论据。(但是字符串的长度是strlen()
)。 - Agnius Vasiliauskas