3

我有一个 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我没有得到想要的响应(显然)。

我怎样才能检查它?

4

3 回答 3

7

你永远无法确定,因为垃圾看起来像是有效的文本,但你可以做出合理的猜测。像这样,假设一个有效的字符串应该以 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;
于 2015-10-26T13:31:44.000 回答
1

鉴于“垃圾值”可能包括任何值,包括值 0,即空终止符,并给出评论中发布的“有效”定义:

有效的定义都是 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;
}

请记住,这将为空格和空终止符返回 false。您将无法假设字符串正确地以 null 结尾,也无法假设值 0 始终意味着字符串的结尾。

于 2015-10-26T14:12:00.970 回答
0

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

于 2015-10-26T13:17:33.853 回答