比较字符串数组

时间:2012-08-31 09:32:23

标签: c

#include<reg51.h>
#include<string.h>
#include"_LCD_R8C.c"
unsigned char c[12];
unsigned char chr[11];
void serial_int (void) interrupt 4
{
  if (RI==1)      
  {
    chr[11] = SBUF;
    RI = 0;     
    TI = 0;     
  }
}

int main()
{
  unsigned char a[2][11]={"$0016221826","$0123456789"};
  int i,j;
  lcd_init();
  lcd_clear();
  SCON = 0x50;              
  TMOD = 0x20;                
  TH1  = 0xFD;                 
  ET0  = 0;                     
  TR1  = 1;                       
  RI   = 1;                   
  ES   = 1;                   
  EA   = 1;
  for(j=0;j<1;j++)
      {
       for(i=0;i<=10;i++)
       {
        c[i]=chr[i];
       }
     c[11]='\0';
     }                   
  for(i=0;i<=1;i++)
  {
    j=strcmp(a[i],c); /* !!! Here is the problem !!! */
    if(j==0)
     {
      lcd_printxy(1,1,"yes");
     }
    else
     {
      lcd_printxy(1,6,"no");
     }
 }
}

我将显示屏显示为“否”,请告诉我这是什么问题? 问题可能是 1)接收到的字符数组不会转换为字符串,或 2)接收到的字符数组将转换为字符串,但无法与可用字符串进行比较。    请仔细阅读该程序

2 个答案:

答案 0 :(得分:0)

初学者的一个明显错误 - 改变:

unsigned char a[2][11]={"$0016221826","$0123456789"};

为:

unsigned char a[2][12]={"$0016221826","$0123456789"};

(你需要为每个字符串中的终止'\0'留出空间 - 我很惊讶你的编译器没有抱怨这个?)

此外,中断处理程序中的这一行是错误的:

chr[11] = SBUF;

这个问题有几个问题 - char只有11个字符的存储空间,而不是12个,你可能想要从索引0累积字符然后碰撞索引,否则你只是覆盖了相同的字符时间。

看看剩下的代码还有很多其他的问题,我认为你可能需要在这里退一步,从一个更简单的程序开始 - 首先运行然后分阶段添加它。

您可能还希望获得一本关于C的正确入门书并对其进行研究,因为代码中存在许多非常基本的错误,因此您可以从更好地理解语言本身中受益。

答案 1 :(得分:0)

您只为chr[11]分配一个值,数组的其余部分未初始化并包含随机数据。然后将包含随机数据的数组复制到c(您可以在这里使用例如memcpy而不是自己循环),最后比较c的完整内容(这是随机数据)使用a中的一个条目。因此,比较的结果是字符串不相等是很自然的。

编辑:重新设计问题中的程序

你的程序有太多问题无法轻易修复,所以我决定尝试重写它:

#include <reg51.h>
#include <string.h>

#include "_LCD_R8C.c"

#define INPUT_LENGTH 11
#define ACCEPTABLE_INPUT_COUNT 2

char input[INPUT_LENGTH];  /* The input from the serial port */
int  input_pos  = 0;       /* Current position to write in the input buffer */
int  input_done = 0;       /* 0 = not done yet, 1 = all input read */

void serial_int (void) interrupt 4
{
    if (!input_done && RI == 1)
    {
        /* Put the input at next position in the input buffer */
        /* Then increase the position */
        input[input_pos++] = SBUF;

        RI = 0;
        TI = 0;

        /* Check if we have received all input yet */
        if (input_pos >= INPUT_LENGTH)
            input_done = 1;
    }
}

int main()
{
    /* Array of data that this programs thinks is acceptable */
    /* +1 to the input length, to fit the terminating '\0' character */
    char acceptable_inputs[ACCEPTABLE_INPUT_COUNT][INPUT_LENGTH + 1] = {
        "$0016221826", "$0123456789"
    };

    iny acceptable_found = 0;  /* Acceptable input found? */

    /* Initialization */
    lcd_init();
    lcd_clear();
    SCON = 0x50;              
    TMOD = 0x20;                
    TH1  = 0xFD;                 
    ET0  = 0;                     
    TR1  = 1;                       
    RI   = 1;                   
    ES   = 1;                   
    EA   = 1;

    /* Wait until we have received all input */
    while (!input_done)
        ;  /* Do nothing */

    /* Check the received input for something we accept */
    for (int i = 0; i < ACCEPTABLE_INPUT_COUNT; i++)
    {
        if (memcmp(acceptable_inputs[i], input, INPUT_LENGTH) == 0)
        {
            /* Yes, the data received is acceptable */
            acceptable_found = 1;
            break;  /* Don't have to check any more */
        }
    }

    if (acceptable_found)
        lcd_printxy(1, 1, "Yes");
    else
        lcd_printxy(1, 1, "No");

    return 0;
}