C 我可以将字符串存储在长度为1的字符数组中吗
我是一个熟悉Java的程序员。但是我很难理解C的一些概念 我在网上遇到一些C代码,它将字符串存储在长度为1的字符数组中C 我可以将字符串存储在长度为1的字符数组中吗,c,C,我是一个熟悉Java的程序员。但是我很难理解C的一些概念 我在网上遇到一些C代码,它将字符串存储在长度为1的字符数组中 char a[0] = 'abcd'; 在Java中。这根本不可能。但是有人能告诉我这在C语言中是否可行吗 如果是,请简要说明 在java中,如果需要存储字符串数组,我会这样做 String[] a = new String[1]; a[0] = "text"; 现在,我需要在C中做这件事,数组大小为1。在C中,字符串是以NUL字符结尾的char数组char*大致对应于Ja
char a[0] = 'abcd';
在Java中。这根本不可能。但是有人能告诉我这在C语言中是否可行吗
如果是,请简要说明
在java中,如果需要存储字符串数组,我会这样做
String[] a = new String[1]; a[0] = "text";
现在,我需要在C中做这件事,数组大小为1。在C中,字符串是以NUL字符结尾的
char
数组String
做C等价的String[]a=新字符串[1];[0]=“字符串”代码>在C中,您可以执行以下操作:
char *a[1]; // this will be stored on the stack so there's no need to allocate memory.
a[0] = "string";
可以将字符串存储在长度为1的char
数组中,但必须为空:
char a[1] = "";
终止空字符是唯一可以存储的内容
如果要在C中执行字符串数组,请执行以下操作:
char *a[1]; a[0] = "text";
不,不可能。
事实上,你发布的代码有很多错误之处
首先,您不能声明大小为零的字符数组,因为所有字符数组(即字符串)都是NULL
终止的,这意味着它们以一个完整的零字节结尾,因此即使您希望有一个空字符串,您也可以这样做
char-empty[1]=“”代码>
而且,在C语言中,char
和string
之间存在着具体的区别。字符写为'a'
,字符串写为“thisastring”
,而在其他编程语言(如Python)中没有这种区别
您可以做些什么,但要小心,因为这只在声明变量时起作用,继续您的示例就是如下声明它
chars[]=“abcd”代码>
如果您想深入了解,可能应该查找有关malloc()
函数的信息。以下几点:
'abcd'
不是字符串-它是一个多字节字符常量,其行为完全特定于实现。注意,在C中,像'A'
和'\n'
这样的字符常量的类型是int
,而不是char
。
声明char a[0]
无效-如果数组大小使用常量表达式(如此处所示),则它必须大于0。这是一个约束冲突,编译器需要发出诊断(尽管它不必停止转换)。
字符串是包含0值终止符的字符值序列。字符串存储在字符类型的数组中(对于“宽”字符串,char
或wchar\u t
),并且数组必须足够大以容纳0终止符-注意,N个字符的字符串需要至少N+1个字符宽的数组来存储。
C不要求对数组写入或访问进行任何边界检查。如果试图将100个字符的字符串存储到一个只有10个元素宽的数组中,那么这些额外的90个字符将在数组结束后立即写入内存,这可能会破坏一些重要的内容。您将不会得到ArrayOutOfBounds异常。根据被覆盖的内容,可能会出现运行时错误。
像“Hello”
这样的字符串文本在程序启动时为它们预留了存储空间,并一直保留到程序终止。字符串文本应该是不可变的(就像Java中的字符串一样),但在某些平台上,字符串文本的存储是可写的。试图修改字符串文字内容的行为是未定义的——这是错误的,但编译器不需要以任何特定方式处理它。它可能会按预期工作,可能会保留未修改的字符串,可能会崩溃,可能会得到诊断,编译器可能会停止翻译,等等。
因此,总之,在1个元素宽的字符数组中只能存储空字符串(即0终止符)
根据您的评论:
在java中,如果我需要存储字符串数组,我会这样做<代码>字符串[]a=新字符串[1];[0]=“文本”代码>现在,我需要在C中完成这项工作,数组大小为1
C中的等效值为:
char *a[1]; // a is a 1-element array of *pointer* to char
a[0] = malloc( strlen( "text" ) + 1 ); // malloc allocates memory from the heap and returns its address
if ( a[0] )
strcpy( a[0], "text" ); // copy the contents of the literal to the heap memory
在这里,您从堆中分配一些内存,将新分配内存的地址存储到a[0]
,然后将字符串literal“text”
复制到新的缓冲区中。由于C不执行自动垃圾收集,因此在使用完后,您需要手动释放该内存:
free( a[0] );
您的文本显示长度为1,但数组的声明长度为0,这是无效的。而'abcd'
不是字符串,而是字符。字符串使用双引号。如果你想学习C,你应该选择一本教科书或教程,这不是方法。或者你可以做char*a[1];[0]=“文本”
@Barmar,char*
不是“字符串”。它是指向“char”的指针。它可能指向字符串中的第一个char
,但不一定要指向。@HAL9000我知道,但为了翻译的目的,它也有类似的作用。如果你阅读要求澄清的注释,你会发现这不是OP的意思。@CoffeeTableEspresso这不是问题的意思。如果注释被删除,那么任何回复它们的答案都将无效。你是对的,应该有人对问题进行编辑,使其更符合OP的实际要求。字符数组根本不必以NUL结尾。有这样一个字符数组是完全有效的:chars[4]=“abcd”代码>“您不能声明大小为零的字符数组,因为所有字符数组(即字符串)都以NULL结尾。”-正确的语句,但动机错误。不能声明大小为零的char(或任何类型)数组,因为C标准是这样规定的。请注意,这在厄尔是不正确的