c语言字符串处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]);
   }
}



 
自动变量 auto
1、自动变量的存储空间为内存中的动态数据区,该区域中的数据随程序需要自动生成或释放(即程序执行到该作用域时分配内存,函数结束立即释放)
2、函数或符合语句内定义的局部变量,只要不说明是static存储类型都为自动变量

静态变量 static
1、静态变量的存储空间为内存中的静态数据区, 该区域中的数据 在整个运行期内一直占用这些存储空间;直到程序结束被释放;
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语言字符串处理的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的“宏”是指啥?

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

C语言,字符串中,溢出字符(ASCII码=27)怎样处理?

C语言程序代码的125个建议

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段