字串處理的兩個問題

2021-09-30 13:19:07 字數 1166 閱讀 6280

處理字元是c語言中的常見操作,有兩個問題需要討論:一是判斷字元處理結束的標誌是空字元還是換行符,二是迴圈處理字元時,迴圈次數是字元陣列的容量大小還是實際輸入字元的個數。

舉例: 鍵盤輸入一行字元,統計大寫字元的個數。

本例可用兩種方法程式設計,第一種方法的**如下:

#include

int main()

下面是第二種方法:

#include

int main()

兩個程式都可正常執行得到正確的結果。

1:結束標誌用空字元還是換行符?

上面兩段程式中,迴圈結束的標誌分別是換行符和空字元,不是說字串最後是乙個空字元麼?為什麼第一種方法用的是換行符?

這是因為,我們鍵入的字串,在敲回車鍵時被送入鍵盤緩衝區,回車鍵被轉換成了換行符『\n』一同送入了緩衝區。第一種方法用的是函式getchar(),它是從緩衝區取字元(而不是從字元陣列中),因此碰到換行符就應該結束。而第二種方法中先用了函式gets(),該函式從緩衝區中取回乙個字串(一直取到換行符為止),然後將字串存到指定的位置(字元陣列s中),而在存字串的時候,會在最後多寫乙個空字元『\0』。程式後面的迴圈部分,我們是判斷陣列元素中的字元(而不是緩衝區中的字元),因此應以空字元為結束標誌。

字串從鍵盤輸入到鍵盤緩衝區直至存入陣列的過程:

鍵盤輸入 緩衝區中內容 陣列內容

abc『a』、 『b』、 『c』、 『\n』           『a』、 『b』、 『c』、 『\0』

由此可知:判斷陣列中的字元時,迴圈應以空字元為結束標誌,而從緩衝區取字元判斷時,應以換行符為結束標誌。

2:迴圈次數是陣列大小還是實際字元個數?

第二段程式中的迴圈,可不可以寫成下面的方式?

for(i = 0; i < 80; i++)

if(s[i] >= 65 && s[i] <= 90)

n++;

答案是不可以。因為80只是字元陣列的最大容量,使用者在鍵盤輸入時,輸入的字元個數可以少於80,因此不能對陣列中的80個元素都進行判斷,而是只判斷其中的有效字元。

可以用下面的方法:

for(i = 0; i < strlen(s); i++)

if(s[i] >= 65 && s[i] <= 90)

n++;

但這種方法需要包含標頭檔案string.h,較麻煩,而且**效率較低。

**

兩個輔助變數挖字串

1 有乙個字串符合以下特徵 abcdef,acccd,eeee,aaaa,e3eeeee,sssss,要求寫乙個函式 介面 輸出以下結果 1 以逗號分割字串,形成二維陣列,並把結果傳出 2 把二維陣列行數運算結果也傳出.2 請自己定義乙個介面 函式 要求1 能正確表達功能的要求,定義出介面 函式 3...

實現兩個長字串相加

兩個大數相加,且這兩個大數是正整數 暫時不考慮負數,不考慮輸入不合法的情況 要保證輸入是正確的才能保證程式正常執行 include include define maxsize 1000 int main temp1 j 0 j 0 for i len2 1 i 0 i 2.把兩個字串補齊,即短字串...

php 擷取兩個指定字元之間的字串

str 要擷取的字串 start str 指定開始的字串 end str 指定結束的字串 start strpos str start str end strripos str end str res substr str start mb strlen start str end start mb...