提示:
(1)計算字符串長度時關鍵是要注意辨認轉義字符;
(2)一個轉義字符總是以反斜杠開始,再加一個其他字符組成。所以,遇到反斜杠時要特別注意!!!
示例:
1、不帶轉義字符的字符串
如:“abc!x=/”,strlen求其長度為 7,但是因為字符串在末尾還有一個終止符‘\0’,因此字符串占8個字節,長度為8.
2、帶轉義字符的字符串
(1) 字符串“abc\n”:其中的'\n'為轉義字符(換行符),計算字符串長度時只能計作一個字符,所以該字符串的長度為5(而不是6)
(2) 字符串“abc\n\\\'\"":其中有4個轉義字符:'\n'(換行符)、'\\'(反斜杠)、'\''(單引號)、'\"'(雙引號),所以該字符串的長度為8(而不是12)。
(3) 字符串“abc\0xyz”:其中有一個轉義字符'\0',它是字符串結束符,所以,當用函數strlen來測試該字符串的長度時,結果應該為4(而不是8)。
(4) 字符串“abc\\0xy”:其中有一個轉義字符'\\'(反斜杠),這樣,后面的字符串“0xy”照樣計算,所以,該字符串的長度為7(而不是將第二個反斜杠與其后的0結合為一個轉義字符'\0',若那樣的話,第一個反斜杠將無法處理,因為一個轉義字符總是由反斜杠加其他字符組成的,單獨的一個反斜杠不能作為任何合法的字符)。
(5) 若將字符串“abc\\0xy”改為“abc\\\0xy”:則其中有二個轉義字符'\\'(反斜杠)和'\0'(字符串結束符),這時,當用函數strlen來測試該字符串的長度時,結果應該為5(而不是8)。
(6) 若將字符串“abc\\\0xy”改為“abc\\\061xy”:則其中有二個轉義字符'\\'(反斜杠)和'\061'(ASCII碼值等於061的字符,也即數字字符'1'),這時,當用函數strlen來測試該字符串的長度時,結果應該為7(而不是4或9)。所以,當遇到轉義字符'\0'時,還要看其后面是否還有數字,若有,則應將后面的數字(一至二位)與前面的'\0'相結合作為一個字符計入整個字符串的長度。
若用printf(“abc\\\061xy”);輸出,則輸出結果為:abc\1xy
注意使用strlen求字符串長度是是不計算末尾的終止符的,但是字符串所占的字節數是包括終止符。
例題一:[1995年二級C筆試選擇題(26)]
請選出以下語句的輸出結果( )
printf("%d\n",strlen("\t\"\065\xff\n"));
(A) 5 (B) 14 (C) 8 (D) 輸出項不合法,無正常輸出
正確答案是(A):字符串中包含的5個字符是:'\t'(跳格符)、'\"'(雙引號)、'\065'(ASCII值為八進制065,也即十進制為51的字符)、'\xff'(ASCII值為十六進制ff,也即十進制為255的字符)、'\n'(換行符)。
例題二:[1998年二級C筆試選擇題(44)]
若有以下程序段:
char str[]="ab\n\012\\\"";
printf("%d",strlen(str));
上面程序段的輸出結果是
A) 3 B) 4 C) 6 D) 12
正確答案是(C):字符串中包含的6個字符是:'a'、'b'、'\n'、'\012'、'\\'和'\"'。如果這一問題是問字符串的長度,則為7。