一个人如何代表空字符?


79

我目前正在编写一个小程序,但在编译时始终出现此错误

错误:空字符常量

我意识到这是因为我正在尝试将有效的char替换为空白,c[i]=''但是我无法找到另一种表示它的方法。


尽管可能有一个空字符串,但没有“空空间”(术语错误)。您是要替换c[i]空格还是要像在按Backspace键时在编辑器中一样从数组中“消除”该字符(即,是否要使用字符c [i-1]和c [ i + 1]在手术后变得相邻)?
洛伦佐·多纳蒂

1
如果您了解字符串,则在声明时可以分配char c[5] = "";空字符串,但char c = '';无效,如以下6个答案所述。
2013年

Answers:


124

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

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


11
是的,没有“空字符”。'\0'是与无关的空字符NULL; 空字符只是一个数字为0的字符。
洛伦佐·多纳蒂

@LorenzoDonati我将其称为空字符,空字符只是为了使用OP的术语。我在编辑中也做了澄清。就像chux指出的那样,NULL对于非指针引用交易不是很好,因此我也做了该笔记。
热情的2013年

1
@LorenzoDonati是的,我决定将其删除,因为它没有为该答案添加任何内容,并且似乎不在讨论范围之内。
热情的2013年

@LorenzoDonati不null char应该是nul char 单身l
Grijesh Chauhan 2013年

2
没有空字符之类的东西。将null char称为空字符是完全错误的。
ChristofferHammarström2015年

27

您不能在字符中存储“无字符”-这没有意义。

作为替代方案,您可以存储一个对您有特殊含义的字符'\0'-例如null char-并对其进行特殊处理。


4
我认为这是一个比公认的更好的答案,后者混淆了null char和empty char。打个比方,这就像说您不能声明int并存储“无数字”一样-您必须存储一些值。
simonwo 2015年

3
您可以使用空字符串,""因为字符串是一个零个或多个字符的序列,但是一个字符恰好是一个值-不为零且不大于零。
simonwo 2015年


9

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

空空间不过是假设是否要分配空间而做的事情:

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

如果要分配,nul char请执行以下操作:

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

示例:假设您有一个字符串,则为 c[]一个字符串(以null\0终止的char数组)。例如:

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

然后用空格替换第二个字符

c[1] = ' ';

并且如果您使用printf进行如下打印:

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

那么输出将是:

  c:  a  c
//      ^ space printed 

然后将第二个char替换为'\ 0'

c[1] = '\0';

那么输出将是:

  c:  a

因为string以结尾\0


如果我们在'\ 0'之后有一些字符怎么办。我的意思是假设我们要删除字符串中的一个字符,例如“ sample” remove m。有没有一种方法可以用某个假设的空字符代替它,而不是通过在其后的字符左移来删除它。
Himanshu Poddar

5

没有“空字符”之类的东西''

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


4

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

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',当字符不存在时,您将拥有,否则将具有普通字符。


3
这个问题是用c而不是c ++
Spikatrix

@CoolGuy好点,你是对的。答案仍然是正确的,它从完成内存分配的方式中抽象出来。
BartoszKP'1

4

有两种方法可以执行相同的指令,即,空字符串。第一种方法是在静态内存上分配一个空字符串:

char* my_variable = "";

或者,如果您想露骨:

char my_variable = '\0';

上面发布的方式仅适用于角色。而且,第二种方式:

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

不要忘了在此代码中使用free(),因为strdup()在内部使用了malloc


2

在字符串中分配null可能会有用,而不是将某些索引显式设置为null char '\0'。我已经将此用于测试处理字符串的函数,以确保它们保持在适当的范围内。

带有:

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

这将创建一个大小为8的数组,其值如下:

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

0

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

其中EMPTY_SPACE =“”(这是字符串)TAB ='\ t'(这是字符)

String after = before.replaceAll(" ", "").replace('\t', '\0');

表示“ =”字之后

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.