我一直在寻找在C/C++中清空char数组的方法。我想出了这样的代码:
char testName[20];
for(int i = 0; i < sizeof(testName); ++i)
{
testName[i] = (char)0;
} 它已经工作了一段时间了,但是当我尝试strlen时,结果总是比输入的word多两个。例如,我输入单词dog,输出为5。为什么是这样?我的char数组没有清除吗?
这是我的代码:
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);
}输出的截图:

作为案文的产出:
Name received: dog
The sentence entered is 5 characters long发布于 2018-02-09 16:33:37
不要在现代C++中使用C样式数组。当您需要一个固定大小的数组时,请改用std::array。从内存存储的角度来看,它们是相同的。
然后,可以使用:myarray.fill('\0')清除数组。
发布于 2018-02-09 16:18:32
如果将“清空char数组”的定义设置为零,则可以使用std::memset。
这将允许您编写此代码,而不是使用clear循环:
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++的方法来填充任何东西的数组:
char testName[arraySize];
std::fill(std::begin(testName), std::end(testName), '\0');std::begin() (和std::end)可以很好地处理编译时大小的数组。
发布于 2018-02-09 16:27:35
另一种用零填充数组的快速方法,仅用于初始化:
char testName[20] = {};相同于
char testName[20] = {0};由于它是一个C99特性,编译器可能会对以下内容进行抱怨
warning: ISO C forbids empty initializer braces更多的这里。
无论如何,看看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);
} https://stackoverflow.com/questions/48709741
复制相似问题