首页 > 代码库 > c语言字符串处理

c语言字符串处理

三类函数   第一: 主函数  mian(){}   第二: 用户自定义函数   第三: c语言提供的库函数         scanf("%d;;;%d",&a,&b); //程序运行时,第一个参数输入后 必须连着敲三个分号 才能让第二个参数赋值       printf("%4d, %-6.2f", 5, 4.345);//默认4d代表右对齐 左边填写三空格, %-6.2f 左对齐 右边填写两个空格                                  |-- 整型  2147483648                         |--浮点型 -- 单双精度             |--基本类型 |--字符型             |           |--枚举类型              |             |  c数据类型  |           |--数组类型             |--构造类型|--结构体类型              |           |-共用体类型             |             |--指针类型             |             |--空类型   所有的数据,在处理时都需要先存放内存,所以不同的类型存储结构不一样单个字符 -由单引号括起来的一个字符; 占1个字节内存,存储内容为该字符的ascII码对应值   char a;   a = getchar();       putchar(a);字符串   -由双引号括起来的字符序列; 在内存中从左到右依次存在连续空间,每个字符1个字节,每个值也是ascII码,注意默认尾部会加\0   char a[] = "i like C";   puts(a);//输出字符串后自动换行        char a[20];   gets(a); // 一次只能输入一个字符串到一个字符数组变量(包括空格和tab 直到回车结束)   字符串的处理时基于字符数组的..部会加\0例如://char c[9];//scanf("%s",c); //注意当格式符为%s时,scanf函数的地址列表是字符数组的名字;void main(){   char str1[9];   char str2[9];   char str3[9] = {"i like C"};    char str4[9] = "i like C";   char str5[] = "i like C";   int i;   for (i=0; i<9; i++)   {      scanf("%c", &str1[i]);   }   str1[9] = \0;      scanf("%s",str2);      printf("%s\n%s",str1,str2); //结果全部相同}  第一个:字符串长度 (strlen()函数)int strlen(字符数组名);  ##返回不含\0的字符串长度第二个:字符串拷贝 (strcpy()函数)boole strcpy(字符数组名, "字符串");  ##返回true or false第三个:字符串拼接 strcat(str1,str2)函数 string strcat(字符数组名, "字符串2"); ##返回 参数1中 \0之前 拼接参数2 后的结果##strcat 注意点1、参数1(字符数组)不能是字符串常量,必须足够大,以便容纳字符串2的内容;2、连接前参数1(字符数组)的\0将被字符串2覆盖,连接后生成新的字符串最后多保留一个\0 第四个:字符串比较 strcmp(字符串1, 字符串2)int strcmp(字符串1, 字符串2);  ##返回 串1大于串2时为正 否则为负 或 零(相等)两个字符串从左到右比较ascii码值的大小直到遇到\0第五个: strlwr(字符串)函数string strlwr("字符串"); ##将字符串中所有大写字母转换为小写字母第六个: strupr(字符串)函数string strupr("字符串"); ##将字符串中所有小写字母转换为大写字母例:#include <stdio.h>#include <string.h>int strlens(char *str){   return strlen(str);}void string_copy(char string1[],char string2[]){  int i;   for (i=0; string2[i]!=\0; i++)  {    string1[i] = string2[i];  }    string1[i] = \0;}void string_strcat(char *str1,char *str2){  printf("\n---%s---\n", strcat(str1,str2));}void main(){   char c[100];   char str[20] = "ni hao beijing";   int  len;    strcpy(c,"hello world");    string_strcat(str, c);    len =  strlens(str);   printf("%s,\n--=%d,\n c=%s",str ,len, c);}二维字符串数组void strarr(){   char strone[2][10] = {{A,b,c},{V,i,p}};   char strtwo[2][10] = {{"Abc"},{"Vip"}};   char strthree[2][10] = {"Abc","Vip"};  printf("\n ---%s---\n",strthree[1]); //---Vip---  printf("\n ---%s---\n", strone[0]); //---Abc---}//连续输入三个学生名字 回车键分隔开; 然后输出void mian(){   char name[3][30];   int i;   for (i = 0; i<3; i++){      gets(name[i]);   }      for (i=0; i<3; i++){      printf(name[i]);   }} 自动变量 auto1、自动变量的存储空间为内存中的动态数据区,该区域中的数据随程序需要自动生成或释放(即程序执行到该作用域时分配内存,函数结束立即释放)2、函数或符合语句内定义的局部变量,只要不说明是static存储类型都为自动变量静态变量 static1、静态变量的存储空间为内存中的静态数据区, 该区域中的数据 在整个运行期内一直占用这些存储空间;直到程序结束被释放;2、所有的全局变量都是静态变量; 局部变量加上static 才为静态变量;3static i = 5; 程序只会定义一次,如果第二次定义时程序发现内存已经存在i就不会执行这句话;寄存器变量 register 1、只有自动变量,或形式参数才可以是寄存器变量;全局变量和静态变量不可以;2、计算机中寄存器数目有限,不能使用太多;3、寄存器好处,如果 函数中有个寄存器变量,在调用函数时 会直接调用寄存器存放的变量值, 比取内存更快;函数结束释放寄存器变量;4、寄存器变量只限 int 、char和指针类型变量使用;如果寄存器满了,程序将会自动转换为自动变量;其他源程序文件公共使用某个变量需要 extern  声明例:extern int num;1、说明全局变量num在其他源程序文件中可以使用;2、如果源程序文件中全局变量仅限该文件使用,只要在该全局变量定义时的类型前加一个 static 3static  int m; 说明全局变量m只能在该文件内有效,其他文件不能引用;宏定义 (宏定义,文件包含,条件编译)1、不带参数的宏定义:    #define 标识符  字符串;   #define N 2   #define F N*2    //定义时可以利用已定义的 宏   作用:在编译预处理时,将源程序中所有标识符换成字符串;即源程序中所有N被换成2 2、带参数的宏定义   例如:   #define L(r) 2*3.1415926*(r)   //注意(r) 括号中r 如果是表达式 程序替换时不会对表达式处理,   #define S(a,b,c) (a+b+c)/3   则表示源程序中如果使用了S(2,3,4)  即编译处理时被替换为 (2+3+4)/3      注意点: 带参数的宏在使用时很像函数 调用;    区别一,带参数的宏不涉及函数调用的流程控制转移,存储空间的分配,参数类型匹配,参数传递即返回值   区别二。函数在调用时在程序运行时执行,而宏替换时在编译预处理阶段执行;(宏的效率更高)3、文件包含时  如果 a.c 中包含了 b.c b.c中有包含了 d.c  那么 a.c中要先 包含d.c 在包含b.c

 

c语言字符串处理