[英]Clear char array in C without any standard library
我正在一个班级项目中,这需要我制作唯一的字符串,并且我想将数字连接到字符串。 但是我无权访问C标准库(memset,malloc等)。 我做了这个工作:
char* concat(char* name, int num) {
int i, j;
char newName[50], stack[5];
for(i=0; name[i]!='\0'; ++i) {
newName[i] = name[i];
}
for (j=0; num>=1 || num==0; j++) {
stack[j] = (num % 10) + '0';
num = num / 10;
if (num==0) break;
}
while (j>=0) {
newName[i++] = stack[j--];
}
name[0] = '\0';
return newName;
}
但是,当我用多个字符串对其进行测试时,我意识到newName被一遍又一遍地重用。 对于前。 该测试文件输出以下内容:
int main() {
char* rebecca = concat("rebecca", 1);
char* bill = concat("bill", 2);
Write(rebecca); /* bill2ca1 */
Write(bill); /* bill2ca1 */
}
它成功地将1附加到rebecca,但是当我在帐单上调用concat时,它将覆盖前5个字母,但在newName中保留之前的相同字符。 问题:如何清除一个char数组,以便在下次调用该数组时将其设置为空,或动态分配它(不使用C标准库)?
无需使用malloc,您可以简单地将内存放在调用函数的堆栈上,以保留在需要内存的范围内。 像这样将缓冲区指针添加到参数列表会更容易:
char* concat(char *newName, char* name, int num) {
int i, j;
char stack[5];
:
:
}
int main() {
char rebecca[50];
char bill[50];
concat(rebecca, "rebecca", 1);
concat(bill, "bill", 2);
write(rebecca);
write(bill);
}
一般来说,在将要使用的内存上分配内存。 嵌入式编程(可能需要运行数月才能重启)避免了像瘟疫一样的malloc,只是因为存在内存泄漏的风险。 然后,您可能需要分配额外的空间,因为您可能在编译时不知道大小,然后理想地检查是否超出了缓冲区末尾。 在这里,我们知道字符串大小和50个字符足够了。
编辑:另一个问题是您不是null终止。 打印将一直进行到达到0x00。 你的线
name[0] = '\0';
应该
newName[i] = '\0';
您遇到了一个重大问题,而您正在忽略。 在您的函数中, newName
是一个局部变量(数组),您将从函数中返回它。 这会调用未定义的行为 。 UB的美妙之处在于,有时似乎按预期方式工作。
如果要从concat()
函数返回指针,则需要获取一个指针并动态分配内存。 另外,在main()
,使用它后,需要free()
它。
如果您选择这样做,一个更好的选择也许是
memset()
。 要记住的一件事是,每次调用该函数都会清除先前的结果。
编辑:
如果不能使用memset()
,则可以使用for
循环,例如
for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
arr[i] = 0;
在下次传递之前清除数组。
您正在返回局部变量的地址。 由于该变量在函数返回时超出范围,因此将调用未定义的行为 。
您的函数应为串联结果动态分配内存,然后返回该缓冲区。 您需要确保稍后free
该缓冲区以防止内存泄漏:
char* concat(char* name, int num) {
int i, j;
char *newName, stack[5];
// allocate enough space for the existing string and digits for a 64-bit number
newName = malloc(strlen(name) + 30);
for(i=0; name[i]!='\0'; ++i) {
newName[i] = name[i];
}
for (j=0; num>=1 || num==0; j++) {
stack[j] = (num % 10) + '0';
num = num / 10;
if (num==0) break;
}
while (j>=0) {
newName[i++] = stack[j--];
}
newName[i] = '\0';
return newName;
}
int main() {
char* rebecca = concat("rebecca", 1);
char* bill = concat("bill", 2);
Write(rebecca);
Write(bill);
free(rebecca);
free(bill);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.