在C中改变一个字符串的大小,有可能吗?

时间:2014-01-16 00:50:21

标签: c string char strlen

我已经阅读了很多关于此的内容,但我无法理解,例如,我想要更改字符串的字符。

我们认为我有以下字符串:

char a [] = "stackoverflow" 

然后我想在最后添加5个字母,或者删除2个以上的字母等等...获取这样的字符串:

char b [] = "stackoverflowstack"
char b [] = "stackoverfl"

我怎么能这样做,请有人向我解释,提前谢谢......

4 个答案:

答案 0 :(得分:1)

您可以使用C库调用(例如malloc)进行动态内存分配。这要求您具有堆内存。我不会进一步讨论,因为有很多参考资料。

如果这不是一个选项,您需要使用strncpy并创建足够大的数组来存储部分结果。

例如,在您选择的示例中:

const char* stackOverflow[] = "stackoverflow";
char a[20];  // Enough room for the largest possible string.

strncpy(a, stackOverflow, sizeof(a));
strncpy(a, "stackoverflowstack", sizeof(a)); // Copy null char as well
strncpy(a, "stackoverfl", sizeof(a)); // Copy null char as well

答案 1 :(得分:1)

最简单的方法是在数组中预先分配足够的内存,以保存您希望存储在其中的最长字符串。

数组是存储区域;它的大小(元素数量)固定在创建它的位置。您无法扩展现有阵列 - 尽管您可以使用realloc替换一个更长的阵列。

string 是一系列字符,包括终止'\0'空字符。

数组可能包含一个字符串 - 字符串的长度与数组的大小不同。

请注意,字符串的长度不包括终止'\0'; `“hello”的长度为5,大小为6。

您的声明:

char a[] = "stackoverflow";

使编译器创建a,其大小足以容纳用于初始化它的字符串。它相当于:

char a[14] = "stackoverflow"; /* 13 characters + 1 for the '\0' */

你可以缩短存储在数组a中的字符串,但它不能容纳长度大于13的字符串:

strcpy(a, "STACK");

在此之后,数组a仍然是14个字符(从不更改),但其内容现在是:

"STACK\0verflow\0"

但是第一个'\0'之后的任何内容都可能会被忽略。

如果您预计存储较长的字符串,可以使用较大的字符串创建它:

char a[100] = "stackoverflow";
strcat(a, " is fun!";

这种方法既浪费(数组可能比目前需要的更大)又容易出错(通过在其中存储过长的字符串很难避免溢出数组边界)。但如果你足够小心,它就足够了。

有一些字符串操作函数可以更容易地避免数组溢出。 strncatstrcat的更安全版本,可让您指定目标数组的大小。还有一些非标准函数,如strlcpy and strlcat

strncpynot recommended。)

其他方法也是可能的。例如,您可以使用malloc()动态分配内存空间,并使用realloc重新分配(使用更大或更小的数组替换数组)。您仍然必须小心不要读取或写入数组的末尾 - 并且您必须自己跟踪数组大小。这是一种更灵活的方法,但它会对程序的性能和作为程序员的性能带来更多的开销。

C(与C ++不同,BTW)没有简单的机制来管理不同长度的字符串。在某些情况下,C字符串工具是构建在其上的高级机制。

答案 2 :(得分:0)

调整字符串大小的唯一方法是最初使用malloc()动态分配它。

您无法调整静态声明的任何内容。

char * a = malloc(14);

a = realloc(a, 20);

(省略了相关的返回值检查)

对于coure,你可以静态地声明一个足够大的数组来保存最大的字符串(加上空终止符):

char a[20];

答案 3 :(得分:0)

简短的回答是否定的。

更长的答案:这些字符串的长度有限,您无法扩展它们。但是你可以创建一个更长的字符串然后在那里连接它们:

char* new_string = (char*) malloc((strlen(a) + strlen(b) + 1) * sizeof(char));
strcpy(new_string, a);
strcat(new_string, b);
printf("%s", new_string);

malloc(size_t len)分配一块内存len个字节。请注意,我分配的内存比所需的长一个字节:C字符串以空字节终止,并且不计入strlen,但它仍然是必需的。

strcpy(char * dst, const char * src)将字符串从位置src复制到位置dst。当dst的长度小于src的长度时,您可能会并且可能会遇到某种不良行为。

strcat(char * dst, const char * src)src的字符串添加到dst的末尾。

你可以使用静态内存分配(比如char new_string[20])而不是malloc,虽然它在某种程度上限制了你的字符串长度(显然)并且可能导致缓冲区溢出:小心它。

进一步阅读:Wikibooks tutorial on string handling