[英]C appending char to char*
所以我试图将char
添加到char*
。
例如,我有char *word = " ";
我也有char ch = 'x';
我append(word, ch);
使用这种方法..
void append(char* s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
}
它给了我一个分段错误,我理解为什么我想。 因为s[len]
超出范围。 我该如何制作呢? 我需要清除char*
,如果我要使用char word [500]之类的东西; 一旦附加了一些字符,我该如何清除? 它的strlen
总是500
? 提前致谢。
典型的C练习如下:
//returns 1 if failed, 0 if succeeded
int append(char*s, size_t size, char c) {
if(strlen(s) + 1 >= size) {
return 1;
}
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
return 0;
}
传递函数时,一个数组来修改函数,在编译时不知道它有多少空间。 C中的常规做法是传递数组的长度,如果函数不能在它所拥有的空间中完成它,函数将信任该约束并失败。 另一种选择是重新分配并返回新数组,您需要返回char*
或将char**
作为输入,但在这种情况下您必须仔细考虑如何管理堆内存。 但是如果没有重新分配,是的,如果在没有空间的情况下要求追加,你的函数必须以某种方式失败,这取决于你如何失败。
尝试在C中就地添加字符串很难。尝试这样的事情:
char *append(const char *s, char c) {
int len = strlen(s);
char buf[len+2];
strcpy(buf, s);
buf[len] = c;
buf[len + 1] = 0;
return strdup(buf);
}
完成后,请务必释放返回的字符串。
仅供参考:可能因为您传递的字符串存储在只读存储器中而导致段错误。 但是你是对的,你也是写完了( [len+1]
写,而不是[len]
)。
如果你要传入
append("foo", 'X');
它会崩溃,因为foo通常放在只读存储器中。 即使不是它也可能会覆盖不好的东西! 在这种情况下,编译器是否应该警告您从const char *到char *的转换,这将是一个线索。
是的,你做的假设是 - 几乎 - 正确 - 崩溃可能是因为你试图写过字符串的边界(实际上只有s[strlen(s) + 1]
超出范围,因为s[strlen(s)]
仍然是一个有效的位置 - 终止NUL字节存储在那里)。 但是你也无法修改字符串文字,因为它通常位于进程内存的某些只读部分。 这两个操作都会导致调用未定义的行为,这些行为可能会崩溃。 您可以通过将字符串复制到动态分配的存储,然后修改副本来解决此问题。 此外,您应该在const char *
的参数中使用const char *
,因为char *
表示无法传入只读字符串。
char *append(const char *orig, char c)
{
size_t sz = strlen(orig);
char *str = malloc(sz + 2);
strcpy(str, orig);
str[sz] = c;
str[sz + 1] = '\0';
return str;
}
另外,当不再需要时,不要忘记free()
返回的字符串。
你不能真正安全地附加到任意字符串,因为首先,字符串常量往往是在只读内存中,所以尝试写入它们可能会导致分段错误,其次,你不能保证如果他们已经通过了你一个缓冲区,你还没有完成它。
特别是,如果你做char x [500];
不能保证strlen(x)会返回500.它将返回它在x到达null之前从x的开头向前计数的字符数。 它可能会返回0,1 ... 500,501 ......,具体取决于x中的内容。
实际上你唯一的选择就是调用append和你要附加的缓冲区的大小(这样你可以在缓冲区已满时做一些适当的事情),或者让append在每次调用时分配一个新的缓冲区,在这种情况下你当然需要再次释放缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.