我需要对字符串进行一些操作(例如在某些位置添加字母)。我不知道它的大小,取决于输入。
如何在不指定大小的情况下定义字符串?我希望它适应我放入的所有内容。
为什么我不能只将一个空值char *
传递给方法呢?编译器不允许这样做。
根据答案,我知道我无法创建大小不受限制的字符串。但是例如,当我尝试创建char arr[100]
并且我的字符串的长度只有8个字符时,我打印时arr
得到的字母比我想要的更多。其中一些甚至都不是字符串的一部分。那怎么可能?
您不能定义大小未知的字符串。但是您可以在需要时使字符串越来越大。所有的字符串和I / O函数都需要获取一个已分配的字符串才能使用,因此您必须花一点时间进行分配,并注意不要超过分配的容量。
但是,当您在字符串长度上具有恒定的上限时,只需分配该长度的字符串就可以了。调整大小更为复杂,因此在不需要时避免调整大小。
字符串是char数组的一部分,以终止\0
。字符串函数遇到第一个\0
字符时将停止读取数组。请记住,它strlen
返回第一个字符之前的字符数\0
,因此,即使数组在第一个\0
字符之后立即结束,字符串长度也严格小于基础数组长度。特别是在这种情况下,数组长度为strlen + 1
。这在分配字符串时很重要。总是为终端分配空间\0
!
例如
char w[7] = "Hello";
是相同的
char w[7] = {'H', 'e', 'l', 'l', 'o', '\0', '\0'};
当用作字符串时,第一个\0
是字符串的结尾,其后的所有字符都将被忽略(不被字符串函数读取)。即使您通过可打印字符(例如,w[6] = '!';
导致具有{'H', 'e', 'l', 'l', 'o', '\0', '!'}
)重写了示例char数组的最后一个元素,puts(w);
也将进行打印Hello
(不是Hello!
或类似的结果)。
当像使用char数组一样使用字符串进行播放时,请确保始终\0
在其末尾包含,否则在由字符串函数读取该数组之后可能会导致segfault的情况下可能未分配的内存。
正如我已经写过的,字符串是char数组的一部分。每个数组必须具有固定的大小。您可以仅使用它的一部分(有效地使其更小),但是必须对其进行分配,并且分配器(malloc
,calloc
)需要知道需要多少内存。
如果您使用数组作为分配比大,你的程序可能与碰撞段错误的更好的情况。如果您非常不幸,您的程序将不会崩溃,只会在数组之后立即使用部分内存,从而产生怪异的结果。
从C99开始,如果可以从初始值设定项中推断出,则可以省略数组长度指定:char w[] = "Hello";
与的结果相同char w[6] = "Hello";
。但是,这对您没有帮助,因为您在编译时指定了初始化程序,并且需要在运行时动态更改字符串长度。
要处理无限长度的字符串,可以创建固定长度的数组,每次长度太短时,分配一个新数组的长度是原来的两倍,然后将原始内容复制到新数组中。(并释放旧的。)您可以用来realloc
为您完成这项工作,并且在不需要移动阵列并且可以将其放置在更长的位置时,还可以获得更高的速度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句