【问题标题】:Cleaning a static char array after use使用后清理静态字符数组
【发布时间】:2018-11-12 18:01:06
【问题描述】:

我希望我的程序清理静态字符数组以获取我尝试过使用 memset 的新输入,但它不起作用或者我做错了。请给点建议。提前致谢。

const char * password() {
     static int i = 0;
     static char pwd[STRING_LEN], c = '\0';
     static char return_buffer[255];

     memset(pwd, 0, sizeof pwd);     //<---
     memset(return_buffer, 0, sizeof return_buffer);     //<--

     printf("Password: ");
     while (i < STRING_LEN){
         pwd[i] = getch();
         c = pwd[i];
         if(c == 13) { break; }
         i++;
     }
     pwd[i] = '\0';

     snprintf(return_buffer, sizeof(return_buffer), "%s", pwd);
     printf("\n");
     return return_buffer;
}

【问题讨论】:

  • 在什么情况下不工作?
  • 如果用户输入STRING_LEN 字符,您将在数组外写入'\0'。您需要while (i &lt; STRING_LEN - 1) 为空值留出空间。
  • if(c == 13) 看起来很可疑。
  • 这取决于平台。
  • 13 不是'\n' 而是'\r'(回车)。由于您使用getch(),我怀疑您在“换行符”由'\r''\n' 组成的Windows 上,因此检查'\r'(= 13)是正确的(tm)事情。不过,'\r''\n' 都不应该导致崩溃。

标签: c arrays memset


【解决方案1】:

此外,无需“清理”数组,因为您正在使用 getch()'\0' 的结果覆盖它们的内容......您永远不会重置 i

i 是一个静态的int,它只会在第一次被初始化,执行通过它的定义点。另外,ipwd 也不需要是静态变量。

【讨论】:

  • 他为什么要重置i
  • 因为他肯定不希望在第 2 次、第 3 次……调用函数时将输入写在先前输入之后。
  • i 是一个静态整数。对该函数的后续调用将继续递增,而不会将其重置回 0。
  • 是的,刚刚注意到static 声明。
  • 答案应该更详细地说明静态变量初始化的工作原理。 ipwd 也完全不需要是静态的。唯一需要静态的变量是 return_buffer,因为它正在被返回。
猜你喜欢
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多