C 检查字符数组是否不是垃圾?(有效字符)

C 检查字符数组是否不是垃圾?(有效字符),c,eeprom,C,Eeprom,我有一个char数组,在硬件中从一些EEPROM设备读取数据,如果那里没有数据,它的值可以是任何东西(垃圾) 我想检查他的值是否不是垃圾,是否有一些有效字符 for(int k=address;k<address+MEM_MAX_LEN;k++) { charBuf[k-address]= EEPROM.read(k);

我有一个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;
                         }
for(int k=address;k1)我没有得到想要的响应(显然)


如何检查它?

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

您永远无法确定,因为垃圾看起来可能像有效文本,但您可以进行合理的猜测。类似这样的情况,假设有效字符串应该以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;
#包括//用于iPrint
// ....
整数长度=0;
而(长度
假设“垃圾值”可能包括任何值,包括值0,也称为空终止符,并给出注释中发布的“有效”的定义:

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;
}
#包括
#包括
#包括
bool有效(常量8*data,大小)
{

对于(size_t i=0;iit不起作用,因为即使它是某种东西,在它获得eprom值后,它也会变得很垃圾。这种方法的另一个问题是,如果我们说它是“***”我检查***,所以如果eprom数据是有效的,我也会得到false来检查。实际上我总是会得到false。如果你使用足够长的某物,垃圾随机生成你的某物的几率就像一百万台打字机上的一百万只猴子。字符串会被NUL终止吗?它会包含不可打印的字符吗acters?一个字节就是一个字节,因此无法区分有效字节和错误字节。数据末尾的CRC(如果固定长度)和您选择的两个STX ETX标记+CRC(如果可变长度)如何?是的,如果eprom数据无效,它可以是不可打印的字符,但如果它有效,我只能得到有效的字符。有没有一种简单的方法来检查有效的字符?eeprom数据是100%正确还是100%不正确,所以我看不出这些要求有什么意义。为了判断某些内容是否有效,您必须首先定义什么是valid和什么不是。还要注意,值0是一个可能的垃圾值。检查eeprom是否有效的正确方法是在数据之后编写校验和。取回有效字符并不一定意味着它不是垃圾。您需要清楚、简洁地定义有效数据的组成部分。谢谢,我们能让它更简单吗假设一个有效值包含所有abc字符或部分abc字符,以及所有数字0-9,例如abc123def。那么您的答案是什么样子的?您只允许小写字符吗?还是也允许大写字符?空格如何?在这种情况下,只需将
isprint
替换为
isalnum
。然后A-Z,A-Z和0-9是允许的。(假设你的语言环境是英语,而不是带有额外字母的外来语言,比如说,瑞典语中有“smörgåsbord”中的字母。)那么就用isalnum?@Curnelious:是的。只要用
isalnum