比较字符串数组 #包括 #包括 #包括“\u LCD\u R8C.c” 无符号字符c[12]; 无符号字符chr[11]; 无效串行输入(无效)中断4 { 如果(RI==1) { chr[11]=SBUF; RI=0; TI=0; } } int main() { 无符号字符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; 对于(j=0;j

比较字符串数组 #包括 #包括 #包括“\u LCD\u R8C.c” 无符号字符c[12]; 无符号字符chr[11]; 无效串行输入(无效)中断4 { 如果(RI==1) { chr[11]=SBUF; RI=0; TI=0; } } int main() { 无符号字符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; 对于(j=0;j,c,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; }

一个明显的缺陷,对于启动器-更改:

#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");
     }
 }
}
致:

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

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

unsigned char a[2][12]={"$0016221826","$0123456789"};
这个字符有几个问题-
char
只能存储11个字符,而不是12个,您可能希望从索引0中累积字符,然后碰撞索引,否则每次只会覆盖相同的字符

看看代码的其余部分,还有很多其他问题,我认为您可能需要退一步,从一个更简单的程序开始——首先让它工作,然后分阶段添加到它


您可能还想得到一本关于C语言的入门书并加以研究,因为代码中有许多非常基本的错误,因此您可能会从更好地理解该语言本身中获益。

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

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

您的程序有太多问题,无法轻松修复,因此我决定尝试重写它:

chr[11] = SBUF;
#包括
#包括
#包括“\u LCD\u R8C.c”
#定义输入长度11
#定义可接受的\u输入\u计数2
字符输入[input_LENGTH];/*来自串行端口的输入*/
int input_pos=0;/*要写入输入缓冲区的当前位置*/
int input_done=0;/*0=尚未完成,1=所有输入读取*/
无效串行输入(无效)中断4
{
如果(!input_done&&RI==1)
{
/*将输入放在输入缓冲区的下一个位置*/
/*然后增加位置*/
输入[input_pos++]=SBUF;
RI=0;
TI=0;
/*检查我们是否已收到所有输入*/
如果(输入位置>=输入长度)
输入_done=1;
}
}
int main()
{
/*此程序认为可接受的数据数组*/
/*输入长度+1,以适合终止字符“\0”*/
字符可接受的输入[可接受的输入计数][输入长度+1]={
"$0016221826", "$0123456789"
};
iny可接受\u发现=0;/*找到可接受的输入*/
/*初始化*/
lcd_init();
lcd_clear();
SCON=0x50;
TMOD=0x20;
TH1=0xFD;
ET0=0;
TR1=1;
RI=1;
ES=1;
EA=1;
/*等待,直到我们收到所有输入*/
而(!输入_完成)
什么也不做*/
/*检查接收到的输入是否为我们接受的内容*/
对于(int i=0;i<可接受的输入\计数;i++)
{
if(memcmp(可接受的输入[i],输入,输入长度)==0)
{
/*是的,收到的数据是可以接受的*/
可接受的_=1;
中断;/*不必再检查*/
}
}
如果(发现可接受)
lcd_printxy(1,1,“是”);
其他的
液晶显示器(1,1,“否”);
返回0;
}

您似乎没有将以前的答案(可能重复)合并到一起问:所以你仍然有很多与2小时前相同的错误?我很抱歉,我在这里循环,因为我通过RS232接收的数据有一系列字符,为了将接收到的数据与其他可用字符串进行比较,我正在使用for循环将其转换为字符串,memcpy可以使其成为字符串吗@pradeep只要数组包含普通字符,并且以零结尾,它就是一个字符串。您可以使用例如
memcpy(c,chr,11);c[11]='\0';
而不是奇怪的循环。在上一个示例中,您解释的是直接获取字符串,即char foo[]=“bar”;但认为bar现在是character,char foo[]=bar;这个bar我想把它变成字符串。@pradeep我添加了你的程序的一个重写版本。在它中,一点也不把输入当作字符串处理。我还把从串行端口收到的每个新字节放在输入数组的一个新位置。还有其他的更改。它当然没有经过测试(我没有你拥有的任何硬件/软件),但我认为它应该可以工作。非常感谢,但是keil编译器显示了一些错误1)字符可接受的输入[可接受的输入计数][]={“$0016221826”,“$0123456789”错误是未知数组大小,所以我将其更改为字符可接受的输入[可接受的输入计数][输入长度]={“$0016221826”,“$0123456789”
chr[11] = SBUF;
#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;
}