C语言 检查如果字符数组不是垃圾?(有效的字符)



我有一个字符数组,其中从一些EEPROM设备中读取数据,在硬件中,如果那里没有数据,其值可以是任何东西(垃圾)。

我想检查他的值是否不是垃圾,并有一些有效字符

                       for(int k=address;k<address+MEM_MAX_LEN;k++)
                       {
                           charBuf[k-address]= EEPROM.read(k);
                           if(charBuf[k-address]=='*')
                         {
                              charBuf[k-address]='';
                              break;
                         }

当使用strlen>1时,我没有得到期望的响应(显然)。

我怎么查?

您永远无法确定,因为垃圾可能看起来像有效文本,但您可以做出合理的猜测。如下所示,假设一个有效的字符串应该以空结束,并且只包含可打印的字符:

#include <ctype.h> // For isprint
// ....
int length = 0;
while (length < MEM_MAX_LEN && charBuf[length] != '')
    ++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;

考虑到"垃圾值"可能包括包括0在内的任何值,即null终止符,并考虑到评论中发布的"有效"的定义:

valid的定义是所有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总是表示字符串的结束。

在使用它之前将它设置为非随机的东西,并测试它是否发生了变化?

相关内容

最新更新