比较字符串数组 #包括 #包括 #包括“\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;
}