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