在C中为char数组赋值
Posted
技术标签:
【中文标题】在C中为char数组赋值【英文标题】:Assigning char array a value in C 【发布时间】:2012-08-23 00:26:36 【问题描述】:有什么区别:
char fast_car[15]="Bugatti";
和
char fast_car[15];
fast_car="Bugatti";
因为第二个导致编译错误:
错误:从类型分配给类型“char[15]”时类型不兼容 ‘字符*’
虽然第一个工作正常。将字符串放入数组中与数组初始化不同的位置会很有帮助。
【问题讨论】:
您可以使用snprintf
或strncpy
之类的字符串函数来用新值填充数组
不要使用strncpy
,除非你真的很确定那是你想要的。确保缓冲区足够大,并改用strcpy
。
@hardpenguin,它会默默地截断字符串。这很少是你想要的。此外,截断时它不会终止字符串。参见例如here。
@harald:strncpy
绝对不会比strcpy
更安全。当然,您必须确定在这两种情况下您会做什么。
@harald:在许多情况下,截断字符串比缓冲区溢出更好(前提是您正确设置了终止空字节)。您知道有多少安全关键错误是由截断字符串导致的?当然,完全不引入错误会更好,但我们都知道这不会发生。真正的解决方案是使用比 C 标准库更好的字符串库。
【参考方案1】:
第一个是初始化,第二个是赋值。由于数组在 C 中不是可修改的值,因此您不能为它们分配新值。
请注意,您可以修改数组内容,但不能说fast_car = ...
。所以内容是可修改的,数组本身是不可修改的。
对这些大相径庭的概念使用相同的符号=
的价值值得商榷。
【讨论】:
str_replace("modifiable", "mutable");
;)
@Nick:字符串替换在 C 语言中实际上并不是那么简单;)
@cnicutar ,你能建议另一种解决方案吗?它是关于从结构中手动分配几个数组变量。使用指向 char 的指针是可行的,但它不是管理内存的糟糕解决方案吗?
另外,初始化可以将数组设置为整个字符串而赋值不能的原因是初始化是通过存储数据可执行映像来完成的,当它“自然”形成程序内存的一部分时加载。除了加载程序之外,它不会导致任何运行时操作。相比之下,赋值需要复制操作,这是一个比 C 最初设计的过程更复杂的过程。
@hardpenguin 您可以使用strcpy
,使用指针等。取决于数据的性质和正在进行的处理。【参考方案2】:
char fast_car[15]="Bugatti";
它说 fast_car 是一个数组,并用字符串“Buratti”初始化。正确用法:
char fast_car[15];
fast_car="Bugatti";
第一行是char数组的声明(未初始化)。其次,这里的 fast_car 只是这个 char 数组中第一个元素的地址(一个指针)。将指针 fast_car 分配给 char "Buratti" 数组的分配因值类型不同而不正确。
【讨论】:
以上是关于在C中为char数组赋值的主要内容,如果未能解决你的问题,请参考以下文章