字符串函数
C语言中提供了许多用来处理字符串的函数,使用这些函数可以大大减轻我们的工作量。
在此之前,先让我们搞清楚一些基本的字符串的一些定义,观察如下语句,看输出的情况是怎样的。
char a[] = "welcome to";
printf("%d\n",sizeof(a)); //由于a是一个字符串,sizeof(a)即代表了字符串的大小,因此这里是11。
printf("%d\n",a); //a是字符串的名称,在编译期间是存在的,不同于字符串指针,程序运行后a是不存在的,
即没有为该字符串名称a给予任何一个存储空间,而a只是作为字符串的首地址而存在,编译
之后所有的以a值都将转变成为具体的存储地址32bit数值。如:1310580
printf("%d\n",a+1); //同理,a+1的值即在地址的基础上加1,为:1310581
printf("%d\n",int(&a)); //这个比较难理解,a既然不是个变量,是不存在的,那这个&a又意味着什么呢。这个我感觉
编译器是将&a作为是整个数组的地址意义,即有点是二维数组的感觉,而恰好这个二维数组
的首地址又是和原来重合的,即结果又是:1310580,这也恰恰证明了a并不是变量,假如a是
某一个字符指针的话,这种情况是不可能出现的。
printf("%d\n",int(&a+1)); //如果能理解上一个式子,这个就容易理解多了,&a+1,即取&a的值再加上sizeof(&a)的内容,
正好是取到了二维数组下一组数组的地址:13105891。在这里sizeof(a)和sizeof(&a)的值是
一样的,都是11。而a+1和&a+1为什么不同呢,我感觉是编译器作了一些识别,更贴近我们思维
的识别,因为一般我们都希望a+1是能是首地址的下一地址的字符内容,这样更方便运算,因此它
绝对没有采用a+1*sizeof(a)这样的运算规则,而是做了些许改变。
printf("%s\n",a); //输出welcome to
printf("%s\n",a+1); //输出elcome to
1.putchar和getchar
putchar(char c);
char getchar(); //从键盘获取一个字符
例如:
a = 'H';
b = 'i';
putchar(a); putchar(b);
c = getchar();
2.printf和scanf
printf(控制字符串, 参数1, 参数2, ..., 参数 n);
控制字符串包括普通字符和格式化字符,格式化字符由%和格式字符组成。
%d:以十进制输出整数值
%o:以八进制输出整数值
%x:以十六进制输出整数值
%u:以无符号形式输出整数值
%c:输出一个字符
%s:输出一个字符串
%f:输出一个浮点数
%e:以科学表示法输出浮点数
%ld:长整形输出
在%与格式字符之间还可以加入一些说明符以对输出格式做进一步的限制
-:输出时左对齐,默认是右对齐,如printf("%-d", i);
dd:指定输出参数所占的最小宽度,如果数据长度小于最小宽度则以空格来填补。如printf("%5d",i),若i的值大于等于5则照常输出,若小于5则左边以空格补齐,若是%-5d,则以右边空格补齐。若是-05d则代表补的不是空格而是字符0。
注:由于scanf对待空白的方式,数据值可以在数据行以多种方式间隔放置,并且使得参数中的变量得到正确的值。如果scanf和printf函数的输出参数比输入参数还要少,则只会存储或输出参数需要的字符,丢弃其他的字符。
3.puts和gets
puts将一个以'\0'结尾的字符串输出到屏幕上。如:(注意程序会自动加上换行符)
char a[] = "welcome to ";
char *p = "Linux C Program";
puts(a);
puts(p);
将输出
Welcome to
Linux C Program。
4.strcpy和strncpy
char *strcpy(char *dest, char *src);
char *strncpy(char *dest, char *src, int n);
两个函数的返回值都是参数dest。strcpy是把src所指向的以'\0'结尾的字符串复制到dest数组中,dest的数组必须足够大,复制连同'\0'一起被复制。而strncpy是只复制src字符串的前n个字符。这样strncpy会比strcpy更为安全,避免了溢出带来的恶意入侵的问题。
5.strcat和strncat
char *strcat(char *dest, char *src);
char *strncat(char *dest, char *src, int n);
这两个函数和上面的类似,strcat把src指向的字符串添加到dest结尾处,覆盖dest的\0,并添加\0。而strncat将src所指向的字符串的前n个字符串添加到dest处。按上面的内容处理。
6.strcmp和strncmp
int strcmp(char *s1, char *s2);
int strncmp(char *s1, char *s2, int n);
字符串比较函数,从左到右逐个字符比较,知道出现不同的字符或遇到\0为止,s1>s2返回1,而s1=s2返回0,s1<s2返回-1。
7.strlen
int strlen(char *s);
返回字符串的实际长度,即不包括\0的长度。
8.strlwr和strupr
char *strlwr(char *s);
char *strupr(char *s);
strlwr将字符串中的所有的大写字母转换为小写字母,而strupr将s指向的所有小写字母转换为大写字母。
9.strstr和strchr
char *strstr(char *s1, char *s2);
char *strchr(char *s, char c);
strstr从字符串s1中寻找到第一次出现字符串s2的位置,并返回s2的位置,没有找到返回NULL。strchr是查找s中第一次出现字符c的位置,返回c的位置,没有找到则返回NULL。