字符串通常是每个一个编程语言必不可少的,也是很常用的概念,而在C语言中没有直接支持这种类型,那我们可以通过间接的方式来实现。此篇文件主要参考《C语言科学与艺术》中关于字符串的章节,有些理论讲得比较到位,所以有必要记录一下。
首先搞清C中字符串的概念,即字符串是由一串零个或多个字符,且以位模式全为0的NUL字节结尾。字符串通常在程序不需要修改字符串的情况下,用一个字符串常量来表示,其它情况下就是通过字符数组或动态分配的内存中,后者要注意要使该数组或动态内存中的数据符合字符串的特点(以NUL结尾)
知识点:
1)字符串可以从三个不同的角度来考虑,作为字符数组,作为指向字符的指针,以及作为概念上的一个整体的抽象实体
2)C语言中,在计算机内部表示为一个以空字符终结的字符数组。
3)C语言中,任何数组都可以解释为指向其第一个元素的指针,同样也可以通过指针形式操作字符串的值
4)将变量声明为字符数组和将变量声明为指向字符的指针具有不同的效果,数组声明过程中会保留确定数目的内存空间,而指针声明只保留足够的空间,且指针要初始化,
5)和任何数组一样,字符数组在C中不能作左值,同样函数返回一个字符数组也是不合法的,但你可以让函数返回一个指针来达到目的。
代码示例:
/* mystr.c --- * * Filename: mystr.c * Description:字符串的概念及其表达 * Author: magc * Maintainer: * Created: 一 7月 23 00:04:54 2012 (+0800) * Version: * Last-Updated: 二 7月 24 06:48:07 2012 (+0800) * By: magc * Update #: 96 * URL: * Keywords: * Compatibility: * */ /* Commentary: * * * */ /* Change Log: * * */ /* Code: */ #include <assert.h> #include <ctype.h> #include <errno.h> #include <limits.h> #include <string.h> #include <stdarg.h> #include <stdlib.h> #include <stdio.h> typedef char * string; char charFromString(char *,int); int firstUpperChar(char str[]); int firstUpperChar2( char *ptr); int firstUpperChar3(string); /************************************************************************** 函数名称:主函数,入口 功能描述: 输入参数: 返 回: **************************************************************************/ int main(int argc, char * argv[]) { char a[6] = "abCde"; char *p = "abCde"; string str = "abCde"; int res = firstUpperChar(a); printf("First Upper Char index is %d\n",res); int res2 = firstUpperChar2(p); printf("First Upper Char index is %d\n",res2); int res3 = firstUpperChar3(p); printf("First Upper Char index is %d\n",res3); printf("\nend\n"); return 0; } /************************************************************************** 函数名称: 功能描述:返回第一个大写字母(以字符数组的形式操作,它又不同于一般数组,不用传递数组长度) 输入参数:字符数组 返 回:字符在数组中的下标位置 int **************************************************************************/ int firstUpperChar(char str[]) { int i; for(i = 0;str[i] != '\0';i++)//中间的判断表达式也可简写为str[i] { if(isupper(str[i])) return i; } return -1; } /************************************************************************** 函数名称: 功能描述:返回第一个大写字母(以指针的形式操作) 输入参数:字符指针 返 回:字符位置(与指针的距离) **************************************************************************/ int firstUpperChar2( char *ptr) { char *cp; for(cp = ptr ; *cp != '\0' ; cp++)//中间的判断表达式也可简写为*cp { if(isupper(*cp)) return (cp - ptr); } return (-1); } /************************************************************************** 函数名称: 功能描述:返回第一个大写字母(以整体string角度来操作) 输入参数:自定义的string类型 返 回:大写字母的位置 **************************************************************************/ int firstUpperChar3(string str) { int i; for(i = 0;i<strlen(str) ;i++) { if(isupper(charFromString(str,i))) return i; } } /************************************************************************** 函数名称: 功能描述:返回string类型指定位置上的字符 输入参数: 返 回: **************************************************************************/ char charFromString(char * str,int i) { return str[i]; } /* mystr.c ends here */
在GCC下编译运行的结果如下:
注:
1)上例中通过定义三个方法,分别使用三种形式来操作字符串,这三种形式各自发挥相应的特长,适合不同的情景需求,可以灵活运用。