计算字符串长度时,有何注意事项?
1.计算字符串长度时关键是要注意辨认转义字符;2.一个转义字符总是以反斜杠开始,再加一个其他字符组成。所以,遇到反斜杠时要特别注意!!!
示例:
3.不带转义字符的字符串
如:“abc!x=/”,strlen求其长度为 7,但是因为字符串在末尾还有一个终止符‘\0’,因此字符串占8个字节,长度为8.
4.带转义字符的字符串
(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。
绛旓細(1) 瀛楃涓测渁bc\n鈥濓細鍏朵腑鐨'\n'涓鸿浆涔夊瓧绗︼紙鎹㈣绗︼級锛岃绠楀瓧绗︿覆闀垮害鏃鍙兘璁′綔涓涓瓧绗︼紝鎵浠ヨ瀛楃涓茬殑闀垮害涓5锛堣屼笉鏄6锛(2) 瀛楃涓测渁bc\n\\\'\""锛氬叾涓湁4涓浆涔夊瓧绗︼細'\n'锛堟崲琛岀锛夈'\\'锛堝弽鏂滄潬锛夈'\''锛堝崟寮曞彿锛夈'\"'锛堝弻寮曞彿锛夛紝鎵浠ヨ瀛楃涓茬殑闀垮害涓8锛堣屼笉...
绛旓細3. 缂栫爜鏍煎紡锛氬湪缂栫▼涓紝瀛楃涓茬殑闀垮害鍙兘杩樹笌鍏剁紪鐮佹牸寮忔湁鍏炽備緥濡傦紝UTF-8缂栫爜涓紝鏌愪簺鐗规畩瀛楃鍙兘闇瑕佸涓瓧鑺傛潵琛ㄧず锛屼絾杩欏苟涓嶅奖鍝瀛楃涓查暱搴鐨璁$畻锛闀垮害閫氬父杩樻槸鎸夌収瀛楃涓暟鏉ヨ绠楃殑銆傞櫎闈炲湪鐗瑰畾鎯呭涓嬶紝姣斿澶勭悊鏂囨湰鏂囦欢鎴栫綉缁滈氫俊涓殑瀛楄妭娴佹椂闇瑕佽冭檻缂栫爜杞崲瀵艰嚧鐨勫瓧绗﹀拰瀛楄妭涔嬮棿鐨勫搴斿叧绯汇傛...
绛旓細杩欓噷闇瑕娉ㄦ剰鍑犵偣📏瀛楃涓查暱搴﹁绠楁柟娉晄trlen缁熻瀛楃涓查暱搴︼紝閬囧埌'\0'缁撴潫锛屼箣鍚庣殑灏变笉缁熻浜嗭紝骞朵笖杩欎釜闀垮害涓嶅寘鍚'\0'銆傛墍浠ユ暟涓鏁拌繖涓瓧绗︿覆鍗13涓瓧鑺傦紝杩欎釜瀛楃涓茬殑闀垮害鏄12銆🔤杞箟瀛楃涓涓眽瀛楀瓧绗﹀崰鐢ㄤ袱涓瓧鑺傦紝\065,\t,\n鏄浆涔夊瓧绗︼紝鍗犱竴涓瓧鑺傦紝瀛楃涓蹭繚瀛樻椂鏈熬澶氫竴涓'\...
绛旓細娉ㄦ剰浜嬮」锛氬湪璁$畻瀛楃涓查暱搴︽椂锛岄渶瑕佹敞鎰忎竴浜涚壒娈婃儏鍐銆傛瘮濡傦紝涓浜涘瓧绗︿覆鍙兘鍖呭惈绌烘牸銆佹崲琛岀绛夌壒娈婂瓧绗︼紝杩欎簺瀛楃涔熼渶瑕佽璁″叆鎬婚暱搴︺傚彟澶栵紝鏌愪簺缂栫爜鏂瑰紡涓嬶紝涓涓瓧绗﹀彲鑳界敱澶氫釜瀛楄妭缁勬垚锛屼絾鍦ㄨ绠楅暱搴︽椂閫氬父杩樻槸鎸夌収瀛楃涓暟鏉ヨ绠椼傛讳箣锛屽瓧绗︿覆闀垮害鐨勮绠椾富瑕佹槸閫氳繃缁熻鍏朵腑鍖呭惈鐨勫瓧绗︽暟閲忔潵瀹炵幇鐨勩傛棤璁...
绛旓細鍦ㄥ嚱鏁板唴閮紝鎴戜滑浣跨敤 C 璇█鐨勫唴缃嚱鏁 strlen 鏉璁$畻瀛楃涓鐨闀垮害锛骞惰繑鍥炵粨鏋溿傚湪 main 鍑芥暟涓紝鎴戜滑瀹氫箟浜嗕竴涓瓧绗︿覆鏁扮粍 string锛屽苟璋冪敤浜嗗嚱鏁 string_length 鏉ヨ绠楀畠鐨勯暱搴︺傛渶鍚庯紝鎴戜滑浣跨敤 printf 鍑芥暟杈撳嚭缁撴灉銆傝繍琛岃繖娈典唬鐮佸悗锛屼細杈撳嚭瀛楃涓 "Hello, world!" 鐨勯暱搴︼紝鍗 13銆娉ㄦ剰锛氬湪 C ...
绛旓細绛旀鏄細瀛楃涓查暱搴涓11銆俓\锛氫唬琛 涓涓瓧绗︼紱\"锛氫唬琛ㄤ竴涓瓧绗︼紱abc 锛氫唬琛3涓瓧绗︼紱01285锛 浠h〃浜斾釜瀛楃锛涙墍浠ヨ瀛楃涓茬殑闀垮害鏄細1+1*2+3+5=11銆傜敤鐢佃剳绔殑vc6.0杩涜浠g爜杩愯锛屾渶鍚庣殑缁撴灉楠岃瘉锛岃瀛楃涓茬殑闀垮害鏄11銆
绛旓細瀛楃涓查暱搴鐨勮绠楋紝鏈変袱涓笉鍚岀殑鏂规硶锛歴izeof鍜宻trlen銆俿izeof涓昏鍏虫敞鏁版嵁鍦ㄥ唴瀛樹腑鐨勫疄闄呭崰鐢ㄧ┖闂达紝瀹冩槸涓涓繍绠楃锛岄傜敤浜庢墍鏈夋暟鎹被鍨嬶紝鍖呮嫭瀛楃涓层傚綋璁$畻瀛楃涓叉椂锛瀹冧細鍖呮嫭鏈熬鐨勭┖瀛楃"\0"锛屼緥濡傦紝瀵逛簬char* str = "Hello!"锛宻izeof(str)鐨勭粨鏋滄槸7锛屽洜涓哄畠鍖呭惈浜嗘暣涓瓧绗︿覆鍜岀┖瀛楃銆俓n ...
绛旓細璁$畻瀛楃涓查暱搴︺佽〃绀鸿鍒犻櫎鐨勫瓧绗︾瓑銆傝绠楀瓧绗︿覆闀垮害锛氫娇鐢╯tring.Length璁$畻瀛楃涓查暱搴︽椂锛鍙兘浼氬緱鍒颁竴涓礋鍊硷紝鏉ヨ〃绀哄瓧绗︿覆涓瓧绗︾殑绱㈠紩锛岃屼笉鏄瓧绗︿覆鐨勫疄闄呴暱搴︺傝〃绀鸿鍒犻櫎鐨勫瓧绗︼細浣跨敤String.Remove鏂规硶浠庡瓧绗︿覆涓垹闄ゅ瓧绗︽椂锛孡ength鍊间細鐩稿簲鍦板噺灏戯紝璐熸暟Length鍊煎弽鏄犱簡琚垹闄ょ殑瀛楃鐨勬暟閲忋
绛旓細鏂规硶涓: 璋冪敤鍐呯疆鍑芥暟strlen姹傚瓧绗︿覆闀垮害 鏂规硶浜: 鍒涘缓涓存椂鍙橀噺璁$畻瀛楃涓查暱搴 棣栧厛锛屾垜浠嚜瀹氫箟鍑芥暟my_strlen姹傚瓧绗︿覆闀垮害鍦╩y_strlen涓敤count缁熻瀛楃鐨勪釜鏁帮紝鎴戜滑浼犲叆鐨刢har绫诲瀷鐨勬寚閽坰tr锛屽浠栬繘琛岃В寮曠敤(*str)寰楀埌str鎸囧悜鐨勫硷紝寰幆鍒ゆ柇(*str)鏄惁绛変簬鈥10鈥,濡傛灉涓嶇瓑锛屽垯count+1锛宻tr鎸囧悜涓嬩竴涓...
绛旓細绠銆侰璇█瀛楃涓茶瀹锛屽瓧绗︿覆闀垮害鏄寚浠庡瓧绗︿覆寮濮嬶紝鍒板瓧绗︿覆缁撴潫绗(\0)涓烘锛屾墍鏈夊瓧绗︾殑鎬绘暟锛屼笉鍖呮嫭\0銆傝繖閲岀殑鎵鏈夊瓧绗︼紝鍚屾牱鍖呮嫭涓嶅彲瑙佸瓧绗︼紝鑷劧鍖呮嫭绌烘牸銆傛瘮濡傦細瀛楃涓"for test"闀垮害鏄8銆