2.2 C风格字符串

第1章在介绍特殊的字符数组时,已经简要介绍过C语言中的风格字符串,本节就C语言中的风格字符串的常用操作简要介绍。

C++语言通常通过char*/const char*类型的指针来操纵C语言中的风格字符串。一般来说,我们使用指针的算术操作来遍历C风格字符串,每次对指针进行测试并递增1,直到到达结束符null为止:

            const char *cp="some value";
            while (*cp) {
            // do something to *cp
            ++cp;
            }

例1:下列代码的输出是什么?

                char x='\0';                    printf("%d", x);//0
                char y='0';                     printf("%d", y);//48
                char z='a';                     printf("%d", z);//65
                char a='A';                     printf("%d", a);//97

解答:可见\0会被转化为十进制的0输出,这也是为什么可以使用while (*cp)的原因(const char*cp="some value";),此时字符串末尾的\0意义同0,我们知道在c/c++中0被转化成bool类型的false。

例2:下面函数的功能是(  )?(2012·优酷土豆)

            int fun(char *x){
                char *y=x;
                while(*y++);
                return (y-x-1);
            }

A.求字符串的长度

C.将字符串x复制到字符串y

B.比较两个字符串的大小

D.将字符串x连接到字符串y后面

解答:A。while循环直到遇到字符串结尾的null字符才退出。然后y-x-1即得字符串长度,可见指向同一个字符串的指针可做算术运算。

例3:What is the result of the following program?(2012·微软)

            char* f(char *str, char ch){
                char *it1=str;
                char *it2=str;
                while (*it2 != '\0') {
                    while (*it2 == ch) {
                        it2++;
                    }
                    *it1++=*it2++;
                }
                return str;
            }
            void main(int argc, char *argv[]){
                char *a=new char[10];
                strcpy(a, "abcdcccd ");
                cout << f(a, 'c');
                delete[] a;
            }

A.abdcccd

B.abdd

C.abcc

D.abddcccd

E.Access Violation

解答:D。其中strcpy将在下节讲解。cout逐个地处理字符串中的字符,直到到达空字符为止,本题中最后一个'\0'的位置未发生变化,所以答案不是B,而是D。