strlen()认为'\ 00'是字符串的结尾。如何计算实际长度?例如。 Pascal http://www.freepascal.org/docs-html/ref/refsu12.html#x35-380003.2.6中有AnsiString类型。它可以包含许多#$ 00,但Length(s)将给出正确的结果。调试编译的pascal代码显示pascal在第一个元素(@s [0] - 4)之前将长度放到dword中,并在需要时为我重新计算它。在C语言中是否有相同的东西(或者我必须手动分配内存并处理-1 - 元素)?如果不是,C语言比Pascal差很多。
答案 0 :(得分:2)
C标准说字符串以NUL字符结尾。该字符串可以存储在一个大于该数组的数组中,但如果只给出一个指向该数组的指针,则无法获得数组的大小。
#include <stdio.h>
void f(char *s)
{
printf("%s\n", s);
// you can't get the size of array s here
}
int main(void)
{
char s[100] = "hi";
printf("size of s = %zu\n", sizeof(s)); // this works
f(s);
return 0;
}
答案 1 :(得分:1)
问题
C语言中是否有相同内容?
不,在C或标准C库中没有类似的东西。但是,该语言提供了构建块来定义这样的类型,并创建API函数来处理类型。
类似的东西:
typedef struct AnsiString
{
size_t len;
char* data;
} AnsiString;
AnsiString createAnsiString(size_t len)
{
AnsiString s;
s.len = len;
s.data = malloc(len);
return s;
}
void deleteAnsiString(AnsiString s)
{
free(s.data);
}
然后你可以使用
AnsiString s = createAnsiString(10);
// Use s as you please
deleteAnsiString(s);
答案 2 :(得分:1)
这个问题的最大问题是字符串在C中不被视为“类型”。它是一种值的模式...例如,考虑十的倍数的整数。它们都以0结尾,但你可以将它们存储在任何类型的整数中,只要它们在范围内。字符串类似;你可以将它们存储在char
,signed char
,wchar_t
等数组中。它们不是类型,但是......它们是符合特定模式的值。
该模式类似于我上面描述的“十的倍数”:字符串是以第一个'\0'
结尾的数字序列。如果没有NUL字符,则不是字符串。这只是一系列人物。
如果您想要数组的大小,并且数组尚未转换为指针类型,则可以使用sizeof array
,因为数组仍然包含大小信息。但是,一旦将数组转换为指针(当使用数组标识符作为参数调用函数时,作为常见示例),您需要手动携带大小信息。标准函数通常使用单独的大小参数,例如fgets(array, sizeof array, stdin);
。
你是否认为C比帕斯卡更好或更差是一个观点问题,你有一个好点。 Pascal vs. C的主要内容是开发编译器的简易性,如果您尝试编写一个编译器,您将会发现它(这是一种学习语言的好方法,btw)。
然而,在宏观方案中,这只是一个较大问题的一小部分,Pascal也主要受其影响。如果您正在开展基于编写表达式代码的能力来比较编程语言的业务,您可能会发现this article ranking programming languages on expressive power很有用。
祝你的语言学习顺利:)很高兴看到人们开发使用语言最大表现力的代码。