C语言基础-字符串篇

文章目录

    • 字符串篇
  • 一、如何定义字符串:
    • 1.定义字符串的第一种方式:
    • 2.定义字符串的第二种方式:
    • 3.定义字符串的第三种方式:
  • 二、字符串的存储方式:
    • 1.和整型数组在存储上的区别:
  • 三、sizeof 和 strlen在字符串计算中的区别
    • 1.计算字符串中的个数:
    • 2.会遇到的问题:
  • 四、字符串的几种常用的API:
    • 1.输出字符串函数 : puts();
    • 2.输入字符串函数 : gets();
    • 3.字符串初始化函数:memset();
    • API总结(一):
    • 4.字符串拷贝(1)函数 strcpy();
    • 5.字符串拷贝(2)函数 strncpy();
    • 6. 字符串拼接函数 strcat();
    • 7. 字符串比较函数 strcmp();
    • API总结(二):
    • 8. 查找子字符串函数 strchr();
    • 9. 查找子串函数 strstr();
    • 10.转为大写的函数: strupr();
    • 11.转为小写的函数: strlwr();
    • 12.字符串分割的函数: strtok();
    • API总结(三):

字符串篇

char str[5]; //类比整型数组

一、如何定义字符串:

1.定义字符串的第一种方式:

char str[]={'a','b','c','d','e'};
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
     printf("%c",str[i]);
}

2.定义字符串的第二种方式:

char str[5]="abcde";
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
     printf("%c",str[i]);
}

3.定义字符串的第三种方式:

char str[]="abcdefghijk";    //元素个数会根据真实大小来默认分配;
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
     printf("%c",str[i]);

1.和整型一样
2.和整型数组略像
3.一般用char *p=“hello”;

二、字符串的存储方式:

字符串在内存种,除了有效字符以外abc,还会自动在后面补充一个 ’ \0 ‘,作为字符串的结束标志

char str[] = "abc";    //数组的大小会根据初始化的时候元素个数来确定
printf("%s",str);       //结果是abc
printf("数组的个数是%d\n",sizeof(str) / sizeof(str[0]) );   //结果是4!  是因为多了一个字符’ \0 ‘ 代表字符串的结束标志

1.和整型数组在存储上的区别:

字符串数组的存储方式:
1.数组:char a[]=“this is my”;
2.指针:char *a=“this is my”;

三、sizeof 和 strlen在字符串计算中的区别

真正计算有效字符长度用strlen

1.计算字符串中的个数:

!!不能用sizeof 来计算字符串中有效字符的个数
要用 strlen ,来计算字符串大小的时候,遇到’ \0 ‘后,就结束计数!
hello \0 world

int a[128]="hello";
printf("真正的hello的真实字母个数用strlen,%d\n",strlen(a));

2.会遇到的问题:

1.网络通信,获取消息有乱码。
2.协议两端不匹配。

四、字符串的几种常用的API:

#include

char *str =“你好”;

1.输出字符串函数 : puts();

puts(str); //与printf("%s",p); 作用等价 区别是 puts();里面自己包含了\n。
原型:int puts(const char *string);

char *pstr;
//这是野指针,造成非法内存访问,会出现段错误 cmd窗口闪退。
解决办法:

char *pstr **= NULL;
pstr = (char * ) malloc (128);
scanf("%s",pstr);
puts(pstr);

2.输入字符串函数 : gets();

gets(str);
//功能:从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
原型: char *gets(char *str);

使用方式:

char *pstr=NULL;
pstr=(char *)malloc(128);
gets(pstr);
puts(pstr);

3.字符串初始化函数:memset();

定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。

memset(初始化对象的开头,初始化成什么字符,初始化多大);
memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。
原型为:
void *memset(void *s, int c, unsigned long n);

char *pstr = NULL;
pstr=(char *)malloc(128);  
//1.申请了空间 
//2.一旦用了malloc就要注意内存泄漏的问题
//3.申请可能失败,要对返回值做判断
if(pstr == NULL){        
      printf("申请内存失败\n");
      exit(-1);
}
memset(pstr , '\0' , 128);

API总结(一):

1.输出字符串:

  1. puts();
  2. printf("%s",p);

2.获取字符串:

  1. gets();
  2. scanf("%s",p);
    //在vs中scanf不安全 用scanf_s代替
    scanf("%s", &a , 20); //三个参数(类型符,地址,大小)

3.计算长度:

  1. strlen();

4.初始化:

  1. memset(数组名,’\0‘ ,数组大小);

4.字符串拷贝(1)函数 strcpy();

strcpy函数 作用是复制字符串。
strcpy函数的声明是“char *strcpy (char *dest, const char *src)”,表示把src所指向的字符串复制到dest。
原型:char *strcpy(char *dest , const char *src);

使用方式:把”你好“复制到Dest数组内

char strDest[128]={'\0'};
char *strSrc="你好";
strcpy(strDest,strSrc);
printf("复制字符串完毕,%s\n",strDest);

5.字符串拷贝(2)函数 strncpy();

char * strncpy (char *de st, con st char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest 所指的数组中,并返回dest 。
原型:
char *strncpy((char *dest , char *src , int n);

说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针(该指向dest的最后一个元素)
利用strncpy替代strcpy来防止缓冲区越界。
但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。

6. 字符串拼接函数 strcat();

strcat (拼接字符串1 , 拼接字符串2 ); //把2拼接到1上

char test[128]="我是xxx";
char *strSrc="你好"strcat(test ,strSrc);
puts(test);

7. 字符串比较函数 strcmp();

strcmp(const char *s1 , const *s2);

char *str1="123";
char *str2="1234";
int ret = strcmp(str1,str2);
printf("ret=%d\n",ret);

结果为 -1 //第一个字符串比第二个字符串小一位

API总结(二):

5.拷贝:

  1. strcpy (类型 *目标指针名 , 类型 *被复制指针名);

    在vs中strcpy不安全 没有方法来保证有效的缓冲区尺寸 用strcpy_s代替 strcpy(char *str1 , 20 , “hello world” ); // 三个参数

  2. strncpy(类型 *目标指针名 , 类型 * 被复制指针名);

6.拼接:

  1. strcat(拼接的目标,拼接的东西); strcat(dest ,str);

7.比较:

  1. strcmp(const char*s1 , const char *s2);
    规则:
    当s1 当s1=s2时 ,返回值 = 0 ;
    当s1>s2时 ,返回为正数;
  2. 特别注意:
    strcmp(const char*s1 , const char *s2);这里只能比较字符串,即可用于比较两个字符串常量,不能比较数字等其他形式的参数。

8. 查找子字符串函数 strchr();

char *strchr(const char *str , int c);
参数说明:
1.*str //要被检索的字符串
2.int c //要在str中搜索的字符

功能:在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
返回值:返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。

使用:在str中找字符 c

char *str = "wangxiaocong";
char c= 'm';
char *p = NULL;
p = strchr(str ,c);
if(p == NULL){
     printf("没有找到\n");
}else{
     printf("找到了\n");
     puts(p);
}

9. 查找子串函数 strstr();

char *strstr(char *str , char *substr);
参数说明:
1.str为要检索的字符串。
2.substr为要检索的子串。

功能:用来检索子串在字符串首次出现的位置
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。

使用:

#include
#include
int main(){
    // 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
    char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
    char *substr = "see";
    char *s = strstr(str, substr);
    printf("%s\n", s);
    return 0;
}

运行结果:
see.xidian.edu.cn/cpp/u/xitong/

10.转为大写的函数: strupr();

char *strupr(char *str);
参数:str //要转换的字符串

功能:用于将字符串中字符转换为大写
返回转换后的小写字符串,其实就是将str返回。

char *str[]="hello";   //windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
puts(strupr(str));

//windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会

11.转为小写的函数: strlwr();

char *strlwr(char *str);
参数说明:str //要转换的字符串

功能:用于将字符串中字符转换为小写
返回转换后的小写字符串,其实就是将str返回。

char *str[]="hello";   //windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
puts(strupr(str));

//windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会

12.字符串分割的函数: strtok();

strtok(char *str , char *tokseps);
参数说明:

  1. str //要进行分割的字符串
  2. tokseps //要分割的字符类型 (以什么来分割)

功能:用于将字符串进行分割。

char *str[]="wang,xiao,cong";
char *p=NULL;
p=strtok(str , "," );
if(p!=NULL){
          printf("获取到第一个串%s\n",p);
}

获取第二个串的方式跟第一次不一样的是,目标字符串改成NULL

p=strtok(NULL,",");
if(p!=NULL){
        printf("获取到第二个串p=%s\n",p);
}

获取第三个串的方式跟第一次不一样的是,目标字符串改成NULL

p=strtok(NULL,",");
if(p!=NULL){
        printf("获取到第三个串p=%s\n",p);
}

除了第一次以外:以此类推!!

字符串的拆分保留:

char str[]="wang,xiao,cong";
char *psubs[10];
int i=1;
p=strtok(str,",");
if(p != NULL){
      psubus[i-1]=p;
}
while(1){
i++;
p=strtok(NULL,",");
 if(p != NULL){
     psubus[i-1]=p;
 }else{
     printf("没有子串了\n",p);
     break;
  }
}
int j;
for(j=0;j<i;j++){
    puts(psubs[j]);
}

API总结(三):

8.查找字符串:

char *strchr(const char *str , int c);

9.查找子串:

char * strstr(char *str , char *substr);

10.字符串分割:

char * strtok(char *str , char *tokseps);

11.转为小写的函数:

char *strlwr(char *str);

12.转为大写的函数:

char *strupr(char *str);

你可能感兴趣的:(C语言,c语言,开发语言)