0
`#include<reg51.h>
#include<string.h>
#include"_LCD_R8C.c"
unsigned char c[11];
void serial_int (void) interrupt 4
{
static unsigned char chr[11];
int i,j;
if (RI==1)      
{
    RI = 0;     
        TI = 0;     
    chr[11] = SBUF;       
        for(j=0;j<1;j++)
         {
       for(i=0;i<=10;i++)
        {
      c[i]=chr;
    }
       c[11]='\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(i=0;i<=1;i++)
{
  **j=strcmp(a,c);**
    if(j==0)
      {
      lcd_printxy(1,1,"yes");
      }
    else
      {
      lcd_printxy(1,6,"no");
      }
}
}`

编译器在第 55 行(粗体)发出警告:指向不同对象的指针。数组到字符串的转换怎么样?这是对的吗?接收到的字符串应该与可用的字符串数组进行比较。

4

2 回答 2

2

创建一个包含字符串的数组,例如

char foo[] = "bar";

它实际上与以下相同

char foo[] = { 'b', 'a', 'r', '\0' };

或以下

const char *foo = "bar";

此变量foo可以用作数组(即第二个字母是foo[1])或用作可以传递给函数的指针(如strlen(foo)将返回 3)。

因此,从程序的角度来看,字符数组或字符指针是等价的,但不能分配给字符数组但可以分配给指针的例外。所以以下是可以的:

char foo[] = "bar";
char *pfoo = foo;

但这不行:

const char *pfoo = "bar";
char foo[] = pfoo;    /* Error! */

字符数组和字符指针之间还有另一点不同:在字符数组上使用sizeof运算符返回数组中的字符数(包括终止的零),但在字符指针上它返回指针的大小。

例子:

char foo[] = "foo";
const char *bar = "bar";

printf("sizeof(foo) = %lu\n", sizeof(foo));
printf("strlen(foo) = %lu\n", strlen(foo));
printf("sizeof(bar) = %lu\n", sizeof(bar));
printf("strlen(bar) = %lu\n", strlen(bar));

如果您在 64 位机器(其中指针为 8 个字节)上运行上述代码,它将打印:

sizeof(foo) = 4
strlen(foo) = 3
sizeof(bar) = 8
strlen(bar) = 3
于 2012-08-31T08:55:57.150 回答
0

a是字符指针数组,c而是字符指针。你必须改变你的喜欢j=strcmp(a[i],c);

编辑:

在您的serial_int函数中,chr是字符数组,因此c[i]=chr不正确。我不知道你的逻辑是什么,但在语法上它应该是c[i]=chr[i].

此外,您没有使用j父循环,这表明您在内部 for 循环的每次迭代中都在做同样的事情。

于 2012-08-31T07:07:59.303 回答