標(biāo)題: 關(guān)于C語(yǔ)言strcmp函數(shù)數(shù)組的比較問(wèn)題 [打印本頁(yè)]

作者: 憶1709    時(shí)間: 2021-2-3 21:44
標(biāo)題: 關(guān)于C語(yǔ)言strcmp函數(shù)數(shù)組的比較問(wèn)題
使用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();
    }
  }
}



作者: lincheng15    時(shí)間: 2021-2-4 11:11
strcmp比較的是字符串,table1 table2是數(shù)組,差異在'\0'
作者: 77599585    時(shí)間: 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, 與前一條功能類似

作者: 憶1709    時(shí)間: 2021-2-4 20:36
lincheng15 發(fā)表于 2021-2-4 11:11
strcmp比較的是字符串,table1 table2是數(shù)組,差異在'\0'

table1和table2我定義的都是uchar,也就是字符型的數(shù)組,那里面的6個(gè)元素,不就是以字符串的形式存在的嗎?哪里理解錯(cuò)了呢?
作者: 憶1709    時(shí)間: 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空間)?
作者: 77599585    時(shí)間: 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'}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1