在C / C ++中清除char数组的最佳方法是什么?

时间:2018-02-09 16:05:23

标签: c++ c arrays

我一直在寻找在C / C ++中清空char数组的方法。我想出了这段代码:

=AND([Appt Time]>TODAY(),[Appt Time]<TODAY()+4)

它已经工作了一段时间但是当我尝试char testName[20]; for(int i = 0; i < sizeof(testName); ++i) { testName[i] = (char)0; } 时,结果总是比键入的单词多两个。例如,我输入单词strlen,输出将为5。为什么会这样?我的char数组没有被清除吗?

这是我的代码:

dog

输出屏幕截图:

Screenshot of the output

以文字输出:

char testName[20];
void loop()
{
  if(Serial.available())
  {
    Serial.println("Waiting for name...");
    index = 0;
    for(int i = 0; i < sizeof(testName); ++i)
    {
        testName[i] = (char)0;
    }
    while(Serial.available())
    {
      char character = Serial.read();
      testName[index] = character;
      index++;
    }
    Serial.print("Name received: ");
    Serial.println(testName);
    Serial.print("The sentence entered is ");
    Serial.print(strlen(testName));
    Serial.println(" long");
    delay(1000);
  } 
  delay(1000);
}

3 个答案:

答案 0 :(得分:14)

不要在现代C ++中使用C样式数组。如果需要固定大小的数组,请改用std::array。从内存存储的角度来看,它们完全相同。

然后,您可以使用以下代码清除数组:myarray.fill('\0')

答案 1 :(得分:6)

如果您定义&#34;清空char数组&#34; 将数组的所有元素设置为零,您可以使用std::memset

这将允许你写这个而不是你的明确循环:

const size_t arraySize = 20;  // Avoid magic numbers!
char testName[arraySize];
memset(&(testName[0]), 0, arraySize);

至于&#34;奇怪&#34; strlen()的结果:

strlen(str)返回&#34;(...)字符数组中的字符数,其第一个元素由str指向,但不包括第一个空字符& #34; 。这意味着,它将对字符进行计数,直到找到零。

检查您传递给strlen()的字符串的内容 - 您可能在那里有白色字符(例如\r\n),这些字符是从输入流中读取的。

另外,建议 - 考虑使用std::string而不是普通char数组。

小记:memset()通常针对高性能进行优化。如果这不是你的要求,你也可以使用std::fill这是一种更像C ++的方式来填充任何数组:

char testName[arraySize];
std::fill(std::begin(testName), std::end(testName), '\0');

std::begin()(和std::end)适用于编译时大小的数组。

另外,要回答@ SergeyA的评论,我建议您阅读this SO postthis answer

答案 2 :(得分:2)

另一种使用零填充数组的快速方法,仅在初始化中:

char testName[20] = {};

相同
char testName[20] = {0};

由于它是C99功能,编译器可能会抱怨以下

warning: ISO C forbids empty initializer braces

更多here

无论如何,看看OP代码,根本不需要初始化/填充数组,它可能会更好:

#define MAX_LENGTH 20
char testName[MAX_LENGTH];
void loop()
{
  if(Serial.available())
  {
    Serial.println("Waiting for name...");
    index = 0;
    while(Serial.available())
    {
      if(index < MAX_LENGTH) 
          testName[index++] = Serial.read();
    }
    if(index < MAX_LENGTH)
    {
      testName[index] = 0;
      Serial.print("Name received: ");
      Serial.println(testName);
      Serial.print("The sentence entered is ");
      Serial.print(strlen(testName));
      Serial.println(" long");
    }
    else
      Serial.print("Name too long ...");

    delay(1000);
  } 
  delay(1000);
}