C中的任意长度字符串

时间:2014-01-04 07:37:13

标签: c string

我需要对字符串进行一些操作(比如在某些地方添加字母)。我不知道它的大小,取决于输入。

如何在不指定字符串大小的情况下定义字符串?我希望它能适应我放在里面的任何内容。

为什么我不能只将空char *传递给方法?编译器不允许这样做。

根据答案,我知道我无法创建无限大小的字符串。但是例如当我尝试创建char arr[100]并且我的字符串长度只有8个字符时,当我打印arr时,我得到了更多的字母然后我想要。其中一些甚至不是字符串的一部分。怎么可能?

4 个答案:

答案 0 :(得分:19)

简短回答

您无法定义大小未知的字符串。但是你可以在需要时使字符串越来越大。所有字符串和I / O函数都需要获取已经分配的字符串,因此您必须稍微分配一下,并注意不要超过分配的容量。

但是,当你在字符串长度上有一个恒定的上限时,只需分配那个长度的字符串,你就会安全。调整大小更复杂,如果您不需要它,请避免使用它。

C

中的字符串是什么

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数组的一部分。每个数组必须具有固定大小。你可以只使用它的一部分(有效地使它变小),但必须分配它,并且分配器(malloccalloc)需要知道需要多少内存。

如果您使用的数组大于已分配的数组,那么在更好的情况下,您的程序可能会因segfault而崩溃。如果你非常不走运,你的程序不会崩溃,只会在数组之后使用内存部分,产生奇怪的结果。

从C99开始,如果它可以是inferred from initializer,则可以省略数组长度规范:\0char 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 ;

我认为这样可以解决问题