我有一个char数组,其中从一些EEPROM设备读取数据,在硬件中,如果没有数据,它的值可以是任何(垃圾)。
我想检查一下他的价值是不是垃圾,还有一些有效的字符。
for(int k=address;k<address+MEM_MAX_LEN;k++)
{
charBuf[k-address]= EEPROM.read(k);
if(charBuf[k-address]=='*')
{
charBuf[k-address]='\0';
break;
}
使用strlen>1
时,我没有得到所需的回复(显然)。
我该如何检查?
答案 0 :(得分:6)
你永远不能确定,因为垃圾看起来像有效文本,但你可以做出合理的猜测。这样的事情,假设一个有效的字符串应该是NUL终止的并且只包含可打印的字符:
#include <ctype.h> // For isprint
// ....
int length = 0;
while (length < MEM_MAX_LEN && charBuf[length] != '\0')
++length;
if (length == 0) {
printf("Empty string. Probably garbage!\n");
return 0;
}
if (length == MEM_MAX_LEN) {
printf("No NUL byte found. Probably garbage!\n");
return 0;
}
for (int i = 0; i < length; ++i) {
if (!isprint((unsigned char)charBuf[i])) {
printf("Unprintable char (code %d) at position %d. Probably garbage!\n",
(unsigned char)charBuf[i], i);
return 0;
}
}
printf("String consists of %d printable characters. Probably not garbage!\n", length);
return 1;
答案 1 :(得分:1)
鉴于&#34;垃圾值&#34;可能包括任何值,包括值0,也就是空终止符,并给出&#34;有效&#34;的定义。发表在评论中:
有效的定义是abc-xyz,所有数字都是0-9。 (例如abc456efg89)
然后简单地写一个这样的函数:
#include <ctype.h>
#include <stdbool.h>
#include <stdint.h>
bool is_valid (const uint8_t* data, size_t size)
{
for(size_t i=0; i<size; i++)
{
if( !isalnum(data[i]) )
return false;
}
return true;
}
请记住,这将为空格和null终止符返回false。您将无法假设字符串被正确地终止,也不能认为值0总是表示字符串的结尾。
答案 2 :(得分:0)
在使用它之前将其设置为非随机的并测试它是否已更改?