【问题标题】:Difference between char[] and strings in C [closed]C中char []和字符串之间的区别[关闭]
【发布时间】:2015-07-02 08:30:29
【问题描述】:

C 编程语言通过以下方式使用引号将字符常量与字符串常量区分开来:

'c'是字符c,而"c"是由单个字符c组成的长度为1的字符串。

为什么会有这种区别?它有什么用处? 这与 C++ 有何不同?

【问题讨论】:

  • "c" 是一个长度为 2 的字符串。
  • How is it useful?---总是太宽泛或不清楚... :-(
  • 一个字符串可以包含多个字符(因此得名)。
  • 这是他们做出的设计决定。 “c”是“c”+“\0”,而“c”只是“c”。大多数字符串操作函数将基于尾随 '\0'
  • @hacks 所以你认为strlen("c") 应该返回 2,然后呢?我认为你只是在增加混乱。字符串的长度不包括终止符。 “内存中的大小”确实如此。

标签: c string char


【解决方案1】:

使用'c' 将告诉编译器您需要一个字符,而使用"c" 将创建一个以空结尾的字符串(与{'c', '\0'} 相同),例如,如果您想要一个不带零的固定字符数组终止符来结束您将使用带单引号的字符数组的字符串,但是如果您想要一个以零结尾的字符数组 - 因此适合在strlen()printf() 和其他您使用双引号的情况下使用。

【讨论】:

  • 嗯,是的,有道理。根据用例,我们可以在 C 中同时使用两者。
【解决方案2】:

你说错了

而“c”是一个长度为1的字符串,由单个字符c组成

“c”是一个字符数组,由两个字符组成,具有静态存储持续时间。您可以通过以下方式来想象它的定义

char s[] = { 'c', '\0' };

标准 C 函数 strlen 通过搜索终止零并计算终止零之前的字符数来确定字符串文字的长度。

如果定义为"",则字符串文字只能包含一个字符(以零结尾)。对于这个“空”字符串字面量函数 strlen 将返回值 0。

字符整数常量或所谓的字符文字的类型为int。它们不是与字符串文字相反的字符数组。甚至像'AB' 这样的多字节字符常量也被转换为int 类型的对象,并且这种转换是实现定义的。 (在 C++ 中,由一个字符组成的字符文字的类型为 char,例如,sizeof( 'A' ) 等于 1,而多字节字符文字的类型为 int,与 C 中的方式相同)

由于字符文字的类型为int,因此它们的大小是固定的,等于sizeof( int )

比较这些语句的输出

printf( "%zu\n", sizeof( 'A' ) );
printf( "%zu\n", sizeof( 'AB' ) );
printf( "%zu\n", sizeof( "A" ) );
printf( "%zu\n", sizeof( "AB" ) );

如果sizeof( int )等于4,那么你会得到

4
4
2
3

注意:编译器可以对语句发出警告或错误

printf( "%zu\n", sizeof( 'AB' ) );

【讨论】:

    【解决方案3】:

    C 是[相对] 低级的静态类型编程语言。

    char c = 'c';
    const char* s = "s";
    

    上述语句的不同不仅在于字面常量的值(c:单字节存储;s:两字节存储+4/8字节指针),而且在变量类型(c:单字节,某些算术运算;s:4/8 字节指针,不同的算术)。

    我认为后者的区别更为重要;字面常量用于更轻松地使用变量、函数参数、结构成员等。

    此外,C 中解决的典型问题属于低级性质,您对单个字符和字符串之间的逻辑差异感兴趣。比如gpio、串口、子串搜索算法。

    [当然 C 也用于其他领域,在 glibenlightenment 等高级项目中,您不太可能看到字符与字符串的区别。]

    Python 是一种高级动态语言。

    c = 'c'
    s = "s"
    

    在上面的语句中,locals/labels cs 指向对象,并且类型是在运行时动态确定的。因此根本不需要区分“字符”和“字符串”。

    用 Python 解决的问题通常要高得多,通常你会处理 JSON blob、HTTP 请求、数据库查询、虚拟机等;即使您需要处理单个字符,长度为 1 的字符串也是可以接受的近似值。

    [如果您使用numpycffi,您会担心字符和字符串的存储,而这些模块提供了这样做的机制。]

    【讨论】:

      【解决方案4】:

      这是他们做出的设计决定。 “c”是“c”+“\0”,而“c”只是“c”。大多数字符串操作函数将基于尾随 '\0'

      因为你试图将它与 python 联系起来。在python中,一切都是对象。当您在 python 中创建字符串时,此对象还会存储字符串长度以及字符串的字符。所有字符串方法都将使用字符串对象中存在的此长度信息。字符只是python中长度为1的字符串。

      由于 C 是一种非常古老的系统编程语言,它应该在非常低内存的设备上工作,他们无法为他们创建的每个字符串创建一个具有长度和其他内容的对象。这是内存浪费。相反,他们使用单个尾随 '\0' 字符来表示字符串

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-04
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 2022-07-24
        • 1970-01-01
        相关资源
        最近更新 更多