繁体   English   中英

无需任何标准库即可清除C中的char数组

[英]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()它。

如果您选择这样做,一个更好的选择也许是

  1. 在调用方中定义数组。
  2. 将数组传递给函数。
  3. 在函数内部,在执行任何其他操作之前先对数组进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM