我需要对字符串进行一些操作(比如在某些地方添加字母).我不知道它的大小,取决于输入.
如何定义字符串而不指定其大小?我希望它适应我放在里面的任何内容.
为什么我不能只将空char *方法传递给方法?编译器不允许这样做.
根据答案,我明白我无法创建无限大小的字符串.但是,例如,当我尝试创建char arr[100]并且我的字符串的长度只有8个字符时,当我打印时,arr我得到了更多的字母然后我想要.其中一些甚至不是字符串的一部分.怎么可能?
Pal*_*lec 20
您无法定义大小未知的字符串.但是你可以在需要时使字符串越来越大.所有字符串和I/O函数都需要获取已经分配的字符串,因此您必须稍微分配一下,并注意不要超过分配的容量.
但是,当你在字符串长度上有一个恒定的上限时,只需分配该长度的字符串,你就会安全.调整大小更复杂,因此如果您不需要它,请避免使用它.
String是char数组的一部分,以\0.字符串函数在遇到第一个\0字符时停止读取数组.请记住,strlen返回第一个之前的字符数\0,因此即使数组在第一个之后立即结束\0,字符串长度也严格小于基础数组长度.特别是在那种情况下,数组长度是strlen + 1.这在分配字符串时很重要; 总是为终止分配空间\0!
例如
char w[7] = "Hello";
Run Code Online (Sandbox Code Playgroud)
是相同的
char w[7] = {'H', 'e', 'l', 'l', 'o', '\0', '\0'};
Run Code Online (Sandbox Code Playgroud)
当用作字符串时,第一个\0是字符串的结尾,后面的任何内容都被忽略(不是由字符串函数读取).即使你用可打印字符重写示例char数组的最后一个元素(例如w[6] = '!';导致有{'H', 'e', 'l', 'l', 'o', '\0', '!'}),puts(w);也会打印Hello(不是Hello!或类似的).
当与字符串作为与字符数组玩时,一定要始终包括\0在其端部与阵列后否则可能未分配存储器由字符串函数,这导致读取段错误.
正如我已经写过的,string是char数组的一部分.每个数组必须具有固定大小.你可以只使用它的一部分(有效地使它变小),但必须分配它,分配器(malloc,calloc)需要知道需要多少内存.
如果您使用的数组大于分配的数组,那么在更好的情况下,您的程序可能会因segfault而崩溃.如果你非常不走运,你的程序不会崩溃,只会在数组之后使用内存部分,产生奇怪的结果.
从C99开始,如果可以从初始化程序推断出,则可以省略数组长度规范:char w[] = "Hello";与结果相同char w[6] = "Hello";.但是,这对您没有帮助,因为您在编译时指定了初始化程序,并且需要在运行时动态更改字符串长度.
要处理无限长度的字符串,可以创建固定长度的数组,每次长度过低时,将新数组分配两倍,并将原始内容复制到新数组.(并释放旧的.)您可以使用realloc为您完成这项工作,当阵列不需要移动时可以获得更高速度的额外好处,并且可以在原地制作更长时间.