首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C/C++中清除char数组的最佳方法是什么?

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

Stack Overflow用户
提问于 2018-02-09 16:05:22
回答 4查看 7.1K关注 0票数 5

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

代码语言:javascript
复制
char testName[20];   

for(int i = 0; i < sizeof(testName); ++i)
{
  testName[i] = (char)0;
}  

它已经工作了一段时间了,但是当我尝试strlen时,结果总是比输入的word多两个。例如,我输入单词dog,输出为5。为什么是这样?我的char数组没有清除吗?

这是我的代码:

代码语言:javascript
复制
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);
}

输出的截图:

作为案文的产出:

代码语言:javascript
复制
Name received: dog

The sentence entered is 5 characters long
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-09 16:33:37

不要在现代C++中使用C样式数组。当您需要一个固定大小的数组时,请改用std::array。从内存存储的角度来看,它们是相同的。

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

票数 15
EN

Stack Overflow用户

发布于 2018-02-09 16:18:32

如果将“清空char数组”的定义设置为零,则可以使用std::memset

这将允许您编写此代码,而不是使用clear循环:

代码语言:javascript
复制
const size_t arraySize = 20;  // Avoid magic numbers!
char testName[arraySize];
memset(&(testName[0]), 0, arraySize);

至于strlen()的“奇怪”结果

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

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

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

注意:memset()通常是为高性能而优化的。如果这不是您的需求,您还可以使用std::fill --这是一种更像C++的方法来填充任何东西的数组:

代码语言:javascript
复制
char testName[arraySize];
std::fill(std::begin(testName), std::end(testName), '\0');

std::begin() (和std::end)可以很好地处理编译时大小的数组。

此外,要回答@SergeyA的评论,我建议阅读这是如此的帖子这个答案

票数 9
EN

Stack Overflow用户

发布于 2018-02-09 16:27:35

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

代码语言:javascript
复制
char testName[20] = {};

相同于

代码语言:javascript
复制
char testName[20] = {0};

由于它是一个C99特性,编译器可能会对以下内容进行抱怨

代码语言:javascript
复制
warning: ISO C forbids empty initializer braces

更多的这里

无论如何,看看OP代码,根本不需要初始化/填充数组,最好是这样:

代码语言:javascript
复制
#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);
} 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48709741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档