C语言。不使用空终止的字符串长度

时间:2015-04-06 04:20:26

标签: c string pascal string-length

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差很多。

3 个答案:

答案 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结尾,但你可以将它们存储在任何类型的整数中,只要它们在范围内。字符串类似;你可以将它们存储在charsigned charwchar_t等数组中。它们不是类型,但是......它们是符合特定模式的值。

该模式类似于我上面描述的“十的倍数”:字符串是以第一个'\0'结尾的数字序列。如果没有NUL字符,则不是字符串。这只是一系列人物。

如果您想要数组的大小,并且数组尚未转换为指针类型,则可以使用sizeof array,因为数组仍然包含大小信息。但是,一旦将数组转换为指针(当使用数组标识符作为参数调用函数时,作为常见示例),您需要手动携带大小信息。标准函数通常使用单独的大小参数,例如fgets(array, sizeof array, stdin);

你是否认为C比帕斯卡更好或更差是一个观点问题,你有一个好点。 Pascal vs. C的主要内容是开发编译器的简易性,如果您尝试编写一个编译器,您将会发现它(这是一种学习语言的好方法,btw)。

然而,在宏观方案中,这只是一个较大问题的一小部分,Pascal也主要受其影响。如果您正在开展基于编写表达式代码的能力来比较编程语言的业务,您可能会发现this article ranking programming languages on expressive power很有用。

祝你的语言学习顺利:)很高兴看到人们开发使用语言最大表现力的代码。