我读过很多关于此的内容,但我无法理解,例如,我想更改字符串的一个字符。改变C中一个字符串的大小,有可能吗?
让我们觉得,我有以下字符串:
char a [] = "stackoverflow"
然后我想在最后添加5个字母,或删除2个字母,等等获取字符串是这样的:
char b [] = "stackoverflowstack"
char b [] = "stackoverfl"
我怎么能做到这一点,有人提前向我解释,请,谢谢...
我读过很多关于此的内容,但我无法理解,例如,我想更改字符串的一个字符。改变C中一个字符串的大小,有可能吗?
让我们觉得,我有以下字符串:
char a [] = "stackoverflow"
然后我想在最后添加5个字母,或删除2个字母,等等获取字符串是这样的:
char b [] = "stackoverflowstack"
char b [] = "stackoverfl"
我怎么能做到这一点,有人提前向我解释,请,谢谢...
你可以使用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
你知道你可以使用'calloc'和'char * a;'替换'char a [20];'和'for'循环? –
是的,谢谢你的意见。我试图创建一个非常简单的例子。 – bblincoe
例子导致持久的习惯,最好提倡好的:) –
来调整一个字符串是与malloc()
最初动态分配的唯一办法。
您无法调整静态声明的任何内容。
char * a = malloc(14);
a = realloc(a, 20);
(省略返回值的相关检查)
课的,你可能只是静态声明数组大到足以容纳最大字符串(加空终止):
char a[20];
简短的回答是否定的。
稍长的答案:这些字符串的长度有限,您无法展开它们。但是你可以创建一个较长的字符串,然后将它们连接起来有:
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,尽管它在某种程度上限制了您的字符串长度(很明显),并且可能导致缓冲区溢出:请小心。
不要施加'malloc'的结果(这是允许的,但它不是必需的,它可以掩盖错误有些情况下)。根据定义,'sizeof(char)'是1。 –
最简单的方法是在数组中预先分配足够的内存以保存您期望存储在其中的最长字符串。
array是存储区域;它有一个大小(元素的数量),它在创建点处被固定。您无法展开现有阵列 - 尽管您可以使用realloc
至替换阵列。
A 字符串是一个字符序列,直到并包括终止的'\0'
空字符。
一个数组可能包含一个字符串 - 并且该字符串的长度与数组大小不同。
请注意,字符串的长度不包括终止'\0'
; `“你好”具有长度的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"
但任何AF第一个'\0'
可能会被忽略。
如果您预计存储更长的字符串,你可以用一个更大尺寸的创建:
char a[100] = "stackoverflow";
strcat(a, " is fun!";
这种方法不仅浪费(数组很可能是大于它需要的时刻)并且容易出错(通过存储过长的字符串很难避免数组边界溢出)。但是,如果你足够小心,它可以足够好。
有一些字符串操作函数可以更容易地避免数组溢出。 strncat
是一个更安全的版本strcat
,可让您指定目标数组的大小。还有一些非标准功能,如strlcpy
and strlcat
。
(strncpy
,但是,是not recommended。)
其他方法是可能的。例如,您可以使用malloc()
动态分配内存空间,然后使用realloc
重新分配它(使用更大或更小的阵列替换您的阵列)。您仍然必须小心,不要读取或写入超过数组末尾 - 并且您必须自己跟踪数组大小。这是一种更灵活的方法,但是它会增加开销,无论是程序性能还是程序员。 C(与C++不同,BTW不同)没有简单的机制来管理不同长度的字符串。在某些情况下,C字符串设施是建立在更高级别的机制之上的。
如果要更改'b'的大小并使用'strncpy'将字符串复制到不同的数组/变量中,则必须调用'realloc'。您不能在同一范围内重新定义已定义的变量。 –
请给我一些例子,或教程,因为我失去了... – superuser
http://www.cprogramming.com/tutorial/c-tutorial.html阅读指针,数组和字符串。 –