我一直在寻找在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
输出屏幕截图:
以文字输出:
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);
}
答案 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 post和this 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);
}