【原創】淺談指針(六)字符串相關


本文原創,僅發布於博客園,如在其他網站看見均為盜取

今天學校有計算機拓展課,抽出時間來寫一篇關於指針的文章。
指針我之前已經寫過五篇文章了,這一篇還是一樣,來講指針。指針是C++中非常值得研究的知識點。因此,想要把指針學好,是不容易的。

前言

今天學校里面看見有人問我一個問題,說是字符串比較的問題。

char s[10];
...
if(s=="123456789")...

沒有語法錯誤,但是運行結果不太對。
大家可以在這個地方停一停,想想是為什么。

字符串比較strcmp

我們之前的文章應該講過,如果沒講過或是不記得了,我們就再重新說一遍。

指針的比較

請在這里允許我摘錄《征服C指針》的一段話:

1.1.8 C是只能使用標量的語言
對於標量(scalar)這個詞,大家可能有些陌生。
簡單地說,標量就是指 char、int、double 和枚舉型等數值類型,以及指針。相對地,像數組、結構體和共用體這樣的將多個標量進行組合的類型,我們稱之為聚合類型(aggregate)。
早期的 C 語言一度只能使用標量。
經常聽到初學者有以下的提問:
if (str == "abc")
這樣的代碼為什么不能執行預期的動作呢?確實已經將“abc”放到了 str 中,條件表達式的值卻不為真。這是為什么?
對於這樣的疑問,通常給出的答案是“這個表達式不是在比較字符串的內容,它只是在比較指針”,其實還可以給出另外一個答案:
字符串其實就是 char 類型的數組,也就是說它不是標量,當然在 C 里面不能用==進行比較了。

上面的解釋應該是比較完善的。
在表達式中,數組如果后面不帶[],就會在表達式中解釋做指針。因此,在這里,數組名str會被解釋做str的地址。
而我們的字符串常量,例如"abc",在表達式中也會解釋做指針。實質上,這個東西本質是數組,我們來做一個簡短的實驗:

#include<bits/stdc++.h>
using namespace std;
char str[3];
int main(){
  printf("%p\n",str);
  printf("%p\n","abc");
  printf("%d\n",sizeof("abc"));
}

根據sizeof的結果,我們可以發現字符串常量的本質是數組而不是指針。(詳細請見之前的文章,數組和指針的sizeof結果是不同的)
而str和"abc"的地址是截然不同的,因此,比較的結果一定不會相等。

strcmp

很多字符串處理的函數都包含在<string.h>中。
strcmp用於比較字符串的大小,返回值如下:

strcmp(a,b)
a=b 返回0
a<b 返回負數
a>b 返回正數

對於部分處理環境,a<b返回-1,a>b返回1,但是如果僅僅對1和-1判斷,在部分環境還是過不去的。
strcmp的本質還是指針運算。我們舉個例子,代碼來源網上:

int strcmp(const char *src,const char *dst){
    int ret=0;
    while(!(ret = *src - *dst) && *dst)
        ++src,++dst;
    return ret;
}

代碼其實比較復雜。由於用到了指針運算。指針運算其實比較復雜和靈活,我們解釋while語句的指針運算。
src-dst表示比較結果,如果比較字符不相等,就會直接退出語句。而*dst表示比較的字符是否為'\0'。

strcpy

由於數組是不可變的,因此,執行str="abc"一類的語句是不對的。
我們需要使用strcpy來實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM