C语言学习笔记之字符串(一)

目录

1,什么是字符串常量

1-1,字符串常量的定义

1-2,字符串常量的初始化

2,字符串的读入输出

2.1输入

2.2输出

3,字符串处理

3.1字符串处理的常用函数

3.2 strcmp() 函数

3.3strlen() 函数

3.4strcpy() 函数

3.4strcat() 函数

3.5strtok() 函数

1,什么是字符串常量

1-1,字符串常量的定义

字符串常量在C语言中通常以字符数组形式储存,以'\0'作为结束(即以转义字符\0来表示终止符NUL)。这里要注意'\0'的存在会让字符串常量的长度多出一位。

1-2,字符串常量的初始化

字符串常量的定义有两种方法:字符数组和指针。

字符串常量在C语言中的本质就是字符数组,但是内容和长度在初始化时就已经固定了,不可更改。利用字符数组初始化字符串常量的方法如下。

char array[10] = {'H','e','l','l','o'};
char array[] = {'H','e','l','l','o'};
char array[] = {"Hello"};
char array[] = "Hello";

其中第一行数组长度为10,后三行长度为6,初始化时及后面调用和更改值的时候注意不能越界。

第二种方法,即利用指针,其实质是用指针储存字符串常量中第1个字符的地址,例如:

char *array = "Hello";

2,字符串的读入输出

2.1输入

也有两种方法,分别为格式字符串%c%s逐字符/整体输入输出。例如:

char array[100]=""
for(int i=0;i<100;i++)
	scanff("%c",&array[i]);


char *array;
for(int i=0;i<100;i++)
    scanf("%c",array++);

逐个字符的读入不仅代码繁琐,运算时间也很长,同时还要对字符串的函数先行进行确定,所以我们常用的是格式控制字符%s整体进行输入,如:

char array[100];
scanf("%s",array);

scanf语句读入字符串的特点是读取到空格处,若要整行读入我们可以用gets,例如:

char array[100];
gets(array);

gets() 函数的读取会持续到接受到换行符或EOF时停止,其中换行符不作为读取串的内容并被转换为‘\0’,以此来结束字符串。

2.2输出

同样的,输出方式也有多种,下面列举常见的几种。

#include<stdio.h>
int main()
{
    char array[] = "Hello",*p=array;

    int i=0;
    while(array[i]!='\0')
        printf("%c",array[i++]);//字符数组逐字符输出
    printf("\n");

    while(*p!='\0')
        printf("%c",*p++);//指针逐字符输出
    printf("\n");

    printf("%s\n",array);//printf函数整体输出

    puts(array);//puts函数整体输出
    printf("\n");

    return 0;
}

注意:整体输出的时候注意字符串最后一位是'\0'。

运行结果如下:


3,字符串处理

3.1字符串处理的常用函数

包含在系统头文件<string.h>中的函数有:

1void *memchr(const void *str, int c, size_t n)
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
2int memcmp(const void *str1, const void *str2, size_t n)
把 str1 和 str2 的前 n 个字节进行比较。
3void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 dest
4void *memmove(void *dest, const void *src, size_t n)
另一个用于从 src 复制 n 个字符到 dest 的函数。
5void *memset(void *str, int c, size_t n)
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
6char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
7char *strncat(char *dest, const char *src, size_t n)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
8char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
9int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
10int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 进行比较,最多比较前 n 个字节。
11int strcoll(const char *str1, const char *str2)
把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。
12char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest
13char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
14size_t strcspn(const char *str1, const char *str2)
检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
15char *strerror(int errnum)
从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
16size_t strlen(const char *str)
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
17char *strpbrk(const char *str1, const char *str2)
检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。
18char *strrchr(const char *str, int c)
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
19size_t strspn(const char *str1, const char *str2)
检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
20char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
21char *strtok(char *str, const char *delim)
分解字符串 str 为一组字符串,delim 为分隔符。
22size_t strxfrm(char *dest, const char *src, size_t n)
根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中。

(资源来自 C 标准库 – <string.h> | 菜鸟教程 (runoob.com)

下面选取几个常用函数进行举例:

3.2 strcmp() 函数

strcmp() 函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。(来源于百度百科φ(≧ω≦*)♪

下面举几(yi)个例子:

#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
	char a1[]="Jii",a2[]="Jin";
	if(strcmp(a1,a2)>0)
	    puts(a1);
	else
	    puts(a2);
	return 0;
} 

结果会是什么呢?根据ASCII码我们可以知道字符串a1,a2的前两位相同,第三位'i'<'n',所以输出结果不出所料就是"Jin"

3.3strlen() 函数

strlen() 所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

简单来说,它最常用的的功能就是计算一个字符串的长度。例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	int len;
	gets(a);
	len=strlen(a);
	for(int i=0;i<len;i++){
	    if(a[i]==' ')
	        continue;
	    printf("%c",a[i]);
	}
	return 0;
}

这是一个去除字符串中空格的简单程序,运行结果如下:

3.4strcpy() 函数

以字符串src,dest为例,strcpy() 函数的作用是把src所指向的字符串复制到dest。需要注意如果目标数组dest不够大,而源字符串src的长度又太长,可能会造成数据溢出的情况。

#include<stdio.h>
#include<string.h>
int main()
{
   char src[40];
   char dest[100];
   strcpy(src,"Hello");
   strcpy(dest,src);
   printf("%s\n",dest);
   return(0);
}

输出结果为"Hello"

3.4strcat() 函数

strcat() 函数常用来将两个字符串连接起来(中间不包含空格)。同时也要注意连接后数据溢出的问题)例:

#include <stdio.h>
#include <string.h>
int main()
{
    char a1[20]="Jini";
    char a2[20]="Taimei";
    strcat(a1,a2);
    printf("%s",a1);
    return 0;
}

输出结果为"JinniTaimei"

3.5strtok() 函数

strtok() 函数可将字符串array分解为一组字符串,a为分隔符(a可以是字符也可以是字符串)。利用一下上面的一段代码,我们可以得到:

#include <string.h>
#include <stdio.h>
int main(){
    char array[100],a[2]=" ",*p;
    gets(array);
    p=strtok(array,a);
    while(p!=NULL){
        printf("%s\n",p);
        p=strtok(NULL,a);
    }
    return 0;
}

这段代码同样可以去除空格,并且能得到以空格为分割的子字符串,运行测试:

 今天的笔记就写到这里吧(绝不是偷懒),欢迎大家来纠错哦!(ノ*・ω・)ノ

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值