检查char数组是不是垃圾? (有效的字符)

时间:2015-10-26 13:16:03

标签: c eeprom

我有一个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时,我没有得到所需的回复(显然)。

我该如何检查?

3 个答案:

答案 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)

在使用它之前将其设置为非随机的并测试它是否已更改?