找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 3818|回復(fù): 5
收起左側(cè)

關(guān)于C語(yǔ)言strcmp函數(shù)數(shù)組的比較問(wèn)題

[復(fù)制鏈接]
ID:847776 發(fā)表于 2021-2-3 21:44 | 顯示全部樓層 |閱讀模式
使用strcmp來(lái)比較兩個(gè)相同的字符數(shù)組時(shí),得不到相等的結(jié)果。根據(jù)程序運(yùn),table1和table2賦值相同的值,應(yīng)該相等才對(duì)啊,但我將if(strcmp(table1,table2)==0)變?yōu)閕f(strcmp(table1,table2)!=0)時(shí),蜂鳴器響了,也就是說(shuō)兩個(gè)數(shù)組不相等。請(qǐng)教下這是什么原因呢?難道不能這樣比較嗎?小弟新手,感謝指教。


代碼:
======================
#include <reg52.h>
#include <intrins.h>
#include <string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Beef=P0^1;
uchar code arrl[]={"123456"};
uchar table1[6],table2[6];
uchar a,s;
void delay(uint i) //延時(shí)函數(shù)
{while(i--);}
void Bee() //蜂鳴器函數(shù)
{
    int x;   
    for(x=1000;x>0;x--)
        {
         Beef=~Beef;
         delay(10);
        }
}
void main()
{
  for(a=0;a<6;a++)
  {
    table1[a]=arrl[a];
    table2[a]=arrl[a];
  }

  if(strcmp(table1,table2)==0)
  {
    while(1)
    {
      Bee();
    }
  }
}


回復(fù)

使用道具 舉報(bào)

ID:693038 發(fā)表于 2021-2-4 11:11 | 顯示全部樓層
strcmp比較的是字符串,table1 table2是數(shù)組,差異在'\0'
回復(fù)

使用道具 舉報(bào)

ID:871393 發(fā)表于 2021-2-4 18:03 | 顯示全部樓層
樓上說(shuō)的對(duì) 我補(bǔ)充一下 存6個(gè)字符的數(shù)組請(qǐng)用7個(gè)byte空間 多一個(gè)留給最后的0,也就是'\0'
字符串復(fù)制可用strcpy或strncpy, 不必循環(huán)

如果不想改以上問(wèn)題, 其他解決方法:
字符串比較可用strncmp. 可避免這個(gè)問(wèn)題
使用內(nèi)存值比較memcmp, 與前一條功能類(lèi)似
回復(fù)

使用道具 舉報(bào)

ID:847776 發(fā)表于 2021-2-4 20:36 | 顯示全部樓層
lincheng15 發(fā)表于 2021-2-4 11:11
strcmp比較的是字符串,table1 table2是數(shù)組,差異在'\0'

table1和table2我定義的都是uchar,也就是字符型的數(shù)組,那里面的6個(gè)元素,不就是以字符串的形式存在的嗎?哪里理解錯(cuò)了呢?
回復(fù)

使用道具 舉報(bào)

ID:847776 發(fā)表于 2021-2-4 22:33 | 顯示全部樓層
77599585 發(fā)表于 2021-2-4 18:03
樓上說(shuō)的對(duì) 我補(bǔ)充一下 存6個(gè)字符的數(shù)組請(qǐng)用7個(gè)byte空間 多一個(gè)留給最后的0,也就是'\0'
字符串復(fù)制可用str ...

想請(qǐng)教下,您的意思是字符型數(shù)組table1[6],這里的6是包含了\0的,對(duì)嗎?那我給它賦值6個(gè)元素之后,\0會(huì)被覆蓋掉嗎?
如果會(huì)被覆蓋掉,那這個(gè)字符數(shù)組是不是就不合法了,所以才導(dǎo)致strcmp結(jié)果不正確?
如果不會(huì)被覆蓋,那我最后一個(gè)元素是否就賦值不成功呢(因?yàn)榧由蟎0一共才6個(gè)byte空間)?
回復(fù)

使用道具 舉報(bào)

ID:871393 發(fā)表于 2021-2-5 09:39 | 顯示全部樓層
憶1709 發(fā)表于 2021-2-4 22:33
想請(qǐng)教下,您的意思是字符型數(shù)組table1[6],這里的6是包含了\0的,對(duì)嗎?那我給它賦值6個(gè)元素之后,\0會(huì) ...

結(jié)尾的0是可以被覆蓋的
str所有函數(shù), 都應(yīng)當(dāng)使用以0結(jié)尾的字符串
你可以使用指針?lè)绞匠跏蓟址?這樣會(huì)默認(rèn)加一位0
unsigned char *str1 = "abc";
這樣str1實(shí)際上就是{'a', 'b', 'c', '\0'}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表