一、strlen和sizeof的区别
#include<stdio.h> #include<string.h> main() { int m,n; m=strlen("hello"); n=sizeof("hello"); printf("%d,%d",n,m); }答案为6和5.
注意这个字符串的长度用strlen来求的话,我们就不用算后面的\0,但是用sizeof来算的话就要算入\0. ‘0’ASCII不为0,但是’\0’的为空值。
字符赋值:char*sp,s[10]; 如果是sp=“hello”,那么是正确的,这个代表将hello的地址存放到sp当中,如果是s=“hello”,这个是错的,s为数组首元素的地址,不能够把“hello”字符串直接赋值给数组的一个地址。
二、如何将字符串赋值给数组 char s[10]={‘s’ ,‘d’,‘f’}这个里面的赋值少于十,所以后面的第四个字符开始,后面全部用字符串结束标志‘\0’来填充。
char s[]={‘s’,‘d’,‘d’,‘f’,‘d’,’\0’} 则这个括号里面应该是隐形的6; char []={‘s’,‘d’,‘d’,‘f’} 这个表达式是错误的,因为没有字符串结束标志\0.
三、正确的字符串的赋值方法最常用的几种: 1、char s[10]={“string”} 2、char s[10]=“string” 3、char s[]=“string”
4、char m[10]; int i; for(i=0;i<9;i++) { scanf("%d",&m[i]) } m[i]=’\0’;
5 用指针来指字符串 ①char *p=“djksjhfsjk” ②char a[10]=“shkjhhsf”,*p; p=a; printf("%s",p)
四、字符串的输入与输出 ①当对字符串进行输出,输出项可以是字符串常量,可以是字符数组名,也可以是已指向字符串的字符指针变量 ②当对字符串输入时,输入项可以是字符数组名,也可以是字符指针变量,当输入的为指针变量的时候,指针变量必须由足够的连续储存单元。 如:
#include<stdio.h> main() { char a[10]; scanf("%s",a); printf("%s\n",a) }我们讨论如果以上程序输入的是ABCD,则我们输出的是ABCD; 如果输入的是A BCD;则只会输出A;因为空格,回车符以及tab键都作为输入数据的分隔符而不能被读入。
五、当输入的是数组元素的地址时,输入的字符将从这一元素开始,依次输出存放到该数组中。
#include<stdio.h> main() { char a[10]={"**********"}; scanf("%s",a);//abcd在内存当中是abcd\0***** printf("%s\n",a); }如果该程序输入的是abcd,那么是从a[0]开始存储的,所以我们输出的结果是abcd. 现在将上面的程序改一下为
#include<stdio.h> main() { char a[10]={"**********"}; scanf("%s",a[3]);//***abcd\0** printf("%s\n",a[3]); }如果该程序输入abcd的话,我们将会输出***abcd。
六、字符串数组 *(p[1]+1)代表的是p[2]的地址。
char a[5]={“abcd”} char[3][5]={“aaa”,“bbb”,“eigh”}
七、用字符串处理的函数 字符串赋值函数 strcpy ,copy 调用形式 strcpy(s1,s2) strlen:求字符串的长度,但是长度不会加入\0; strcmp:比较两个字符串的大小,谁先大就谁大 strcat:连接两个字符串。strcat(s1,s2),将s2连接到s1后面。
注意:这个连接以及复制都是需要将\0连带一起的连接以及复制的,不要忽略了。
八、程序举例 ①、编写函数slength(char*s),函数返回指针 s所指字符串的长度,即相当于库函数strlen的功能
#include<stdio.h> int slength(char *s) { int n=0; while(*s) { n++; s++; } return n; } main() { char str[]="ABCDEFG" int length; length= - slength(str) ; printf("%d\n",length); }②编写scopy(char *s,char *t),将指针t所指的字符串复制到指针s所指的储存空间中。
#include<stdio.h> void scopy(char *s,char *t) main() { char str1[20],str2[20]; gets(str2); scopy(str1,str2); puts(str1); } void scopy(char *s,char*t) { while ((*s=*t)!='\0')i++; }③编写函数scomp(chars1,chars2),将两个字符串s1和s2进行比较,若串s1=串s2,函数值返回值为0,若串s1>串s2,函数值为正数;若串s1<串s2,则函数值为负值,即相当于strcmp的功能。
#include<stdio.h> #define N 40 #define N 61 int gettext(char (*t)[N]); void puttext(char t[][N],int s); int scomp(char*s1,char*s2) { int i=0; while (s1[i]==s2[i]&&s1[i])i++; return s1[i]-s2[i]; } main() { char str1[]="ABCD",str2[20]; gets(str2); if(scomp(str1,str2)>0)printf("str1>str2\n"); else if(scomp(str1,str2<0) printf("str1<str2\n"); else printf("str1=str2"); }④编写程序从终端读入若干文本行(不超过4行,每行不超过60个字符),遇到行结束输入,然后将此文本左侧加上行号后输出。
#include<stdio.h> main() { char text[N][N] int k; k=gettext(text); puttext(text,k); } int gettext(char(*t)[N]) { int i; get(t[i]); while(*t[i]) { i++; gets(t[i]); } return i; } void puttext(char t[][N],int s) { int j; for(j=0;j<s;j++) { printf("%d:",j+1); puts(t[j]); } }⑤从输入的若干个字符中找出最小的串输出
#include<stdio.h> #define N 40 #define M 50 int getstr(char t[N][M]) { int i=0; gets(t[i]); while(*t[i]); { i++; gets(t[i]); } return i; } char *findmin(char t[][M],int s) { char *p; int i; p=t[0]; for(i=1;i<s;i++) { if(strcmp(t[i],p)<0) p=t[i]; return p; } } main() { char str[N][M],*p; int n; n=getstr(str); p=findmin(str,n); puts(p); }