【问题标题】:How does one represent the empty char?一个如何代表空字符?
【发布时间】:2013-08-26 22:36:41
【问题描述】:

我目前正在编写一个小程序,但在编译时我不断收到此错误

错误:空字符常量

我意识到这是因为我试图用空格 c[i]='' 替换一个有效的字符,但我无法找到另一种表示它的方式。

【问题讨论】:

  • 没有“空格”(错误的术语),尽管可能有一个空字符串。您想用 空格 替换 c[i],还是想像在编辑器中按下退格键时那样从数组中“消除”该字符(即,您想要chars c[i-1] 和 c[i+1] 运算后变成相邻的)?
  • 如果您理解字符串,那么在声明时您可以分配 char c[5] = ""; 空字符串,但 char c = ''; 无效,如下面的 6 个答案所述。

标签: c


【解决方案1】:

您可以使用c[i]= '\0' 或简单地使用c[i] = (char) 0

null/empty char 只是一个零值,但也可以表示为带有转义零的字符。

【讨论】:

  • 是的,而且没有“空字符”。 '\0'null charNULL 无关;空字符只是一个以 0 作为数字代码的字符。
  • @LorenzoDonati 是的,我决定删除它,因为它对这个答案没有任何帮助,而且似乎与手头的讨论无关。
  • @GrijeshChauhan 它被称为空字符或空终止字符,但缩写为nul。见tools.ietf.org/html/rfc20#section-5.2。在 ANSI C 标准中它也被称为空字符。
  • @GrijeshChauhan 和 ardentsonata 对于更具体的参考,C99 标准草案 (N1256) 在第 5.2.1 节(字符集)第 2 段中定义了该术语:“[...]A byte with所有位设置为 0,称为 空字符,应存在于基本执行字符集中;它用于终止字符串。" C/C++ 术语总是有点噩梦;-)
  • 没有空字符这样的东西。将 null char 称为空字符是完全错误的。
【解决方案2】:

你不能在一个字符中存储“无字符”——这没有意义。

作为替代方案,您可以存储对您具有特殊含义的字符 - 例如null char '\0' - 并特别对待它。

【讨论】:

  • 我认为这是一个比公认的更好的答案,它混淆了空字符和空字符。打个比方,这就像说你不能声明一个 int 并存储“无数字”——你必须存储 some 值。
  • 你可以有一个空字符串"",因为字符串是零个或多个字符的序列,但一个字符恰好是一个值——不是零也不是更多。
【解决方案3】:

空白字符为' '。如果您正在寻找 null,那就是 '\0'

【讨论】:

    【解决方案4】:

    是的,c[i]='' 不是有效代码。我们在 ' ' 之间加上括号字符常量,例如c[i] = 'A'; 字符 A。但你没有在'' 之间写任何字符。

    空的空间不过是假设如果你想分配空间然后做:

    c[i] = ' ';
    //      ^  space 
    

    如果想分配nul char 然后做:

    c[i] = '\0';
    //       ^ null symbol 
    

    示例:假设 c[] 是一个字符串(nul \0 终止的字符数组),如果你有一个字符串。例如:

    char c[10] = {'a', '2', 'c', '\0'};
    

    用空格替换第二个字符

    c[1] = ' ';
    

    如果你使用 printf 打印它,如下所示:

    printf("\n c: %s", c);
    

    那么输出将是:

      c:  a  c
    //      ^ space printed 
    

    而您将第二个字符替换为 '\0'

    c[1] = '\0';
    

    那么输出将是:

      c:  a
    

    因为字符串以\0 结尾。

    【讨论】:

    • 如果我们在 '\0' 之后有一些字符怎么办。我的意思是假设我们要删除字符串中的一个字符,例如“sample”remove m。难道只有一种方法可以用一些假设的空字符替换它,而不是通过它后面的字符左移来删除它。
    • @HimanshuPoddar 不,这是不可能的,因为您假设的空字符不存在。我们拥有的最接近的是 Unicode 字符 U+200B Zero Width Space,但它不能用 8 位字符表示。
    【解决方案5】:

    没有“空字符”'' 这样的东西。

    如果您需要一个空格字符,它可以表示为一个空格:c[i] = ' ' 或它的 ASCII 八进制等效值:c[i] = '\040'。如果您需要一个 NUL 字符,即c[i] = '\0'

    【讨论】:

      【解决方案6】:

      要表示该值不存在,您有两种选择:

      1) 如果整个char 范围是有意义的并且您不能保留任何值,则使用char* 而不是char

      char** c = new char*[N];
      c[0] = NULL; // no character
      *c[1] = ' '; // ordinary character
      *c[2] = 'a'; // ordinary character
      *c[3] = '\0' // zero-code character
      

      然后,当字符不存在时,您将拥有c[i] == NULL,而对于普通字符,您将拥有*c[i]

      2) 如果您不需要char 中可表示的某些值,则保留一个以指示该值不存在,例如'\0' 字符。

      char* c = new char[N];
      c[0] = '\0'; // no character
      c[1] = ' '; // ordinary character
      c[2] = 'a'; // ordinary character
      

      那么当字符不存在时你将有c[i] == '\0',否则为普通字符。

      【讨论】:

      • 问题标记为c,而不是c++
      • @CoolGuy 好点,你是对的。答案的重点仍然存在,从内存分配的方式中抽象出来。
      【解决方案7】:

      同一条指令有两种方式,即空字符串。第一种方法是在静态内存上分配一个空字符串:

      char* my_variable = "";
      

      或者,如果你想明确:

      char my_variable = '\0';
      

      上面贴的方式只针对一个角色。 还有,第二种方式:

      #include <string.h>
      char* my_variable = strdup("");
      

      不要忘记将 free() 与这个一起使用,因为 strdup() 使用 malloc em> 在里面。

      【讨论】:

        【解决方案8】:

        在字符串中分配一个空值而不是显式地将某个索引设为空字符'\0' 可能很有用。我用它来测试处理字符串的函数,确保它们保持在适当的范围内。

        与:

        char test_src[] = "fuu\0foo";
        

        这将创建一个大小为 8 的数组,其中包含值:

        {'f', 'u', 'u', '\0', 'f', 'o', 'o', '\0'}
        

        【讨论】:

          【解决方案9】:

          String before = EMPTY_SPACE+TAB+"word"+TAB+EMPTY_SPACE;

          其中 EMPTY_SPACE = " " (这是字符串) TAB = '\t' (这是字符) String after = before.replaceAll(" ", "").replace('\t', '\0'); 表示在 = "word" 之后

          【讨论】:

            【解决方案10】:

            这是单引号和双引号含义不同的情况。

            "" 被编译器翻译成(const char[1])""。这使您可以在字符数组的初始化中使用它。

            '' 不是,而是一个未终止的空字符串。因为你不能在不终止它的情况下判断一个字符串是否为空,所以这不是有效的代码。因此出现错误。

            你几乎肯定想做

            c[i] = '\0';
            

            如果c 确实是一个文本字符串,这会将字符串的长度设置为 i,并在该字符上终止。

            如果c 实际上不是作为文本字符串,这仍然是您应该用来表示那里什么都没有的值, 因为它是假的,而任何其他字符都是真的。

            如果你真的想在那里放一个空间,那么你想要

            c[i] = ' ';
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-08
              • 1970-01-01
              • 2010-12-06
              • 2019-02-16
              • 1970-01-01
              • 1970-01-01
              • 2017-02-08
              • 1970-01-01
              相关资源
              最近更新 更多