我已经阅读了很多关于此的内容,但我无法理解,例如,我想要更改字符串的字符。
我们认为我有以下字符串:
char a [] = "stackoverflow"
然后我想在最后添加5个字母,或者删除2个以上的字母等等...获取这样的字符串:
char b [] = "stackoverflowstack"
char b [] = "stackoverfl"
我怎么能这样做,请有人向我解释,提前谢谢......
答案 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!";
这种方法既浪费(数组可能比目前需要的更大)又容易出错(通过在其中存储过长的字符串很难避免溢出数组边界)。但如果你足够小心,它就足够了。
有一些字符串操作函数可以更容易地避免数组溢出。 strncat
是strcat
的更安全版本,可让您指定目标数组的大小。还有一些非标准函数,如strlcpy
and strlcat
。
(strncpy
是not 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,虽然它在某种程度上限制了你的字符串长度(显然)并且可能导致缓冲区溢出:小心它。