c语言笔记整理(字符串)

内容包括但不限于:

1.#include<string>头文件(以及其中包含的常见处理函数)

2.字符串的多种赋值方式(1.指针2.数组3.string)

3.指针形式和数组形式的差别

4.指针与字符串(详见指针篇)

5.指针、数组、string表示字符串所占字节差别

6.连续输入一串字符串

简述c语言"字符串"

(1)c语言中没有字符串类型,只能用字符数组来存放字符串(可以std::string重载调用),其中'\0'作为结束标志。

(2)但是c语言中有字符串常量,如定义"HelloWorld"是个字符串常量。字符串常量占用一串连续的内存空间,没有名字但是有地址。

(3)'\0'是转义字符,称为“空值”,ASCII值为0,它占用存储空间,但不计入字符串总长度。

#include<string>头文件

(此处讲的是c++中的头文件,c语言中为<string.h>)

C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针

c++<string>常用成员方法:

1)求字符串长度 :str.length();
2)字符串拼接

string s1 = "";
string s2 = "";
s2 = s2 + s1;

3)插入字符串:str.insert(pos, new_str);

pos 表示原字符串 str中要插入的位置,即下标(位置要小心越界)
new_str 表示要插入的字符串,可以是 string字符串,也可以是C风格的字符串

4)删除字符串:str.erase(pos=0, len);

pos 表示字符串 str中要删除的起始位置,即下标(默认为0)
len 表示要删除的字符串长度,如果不设置 len,则默认删至结尾

5)提取字符串:str.substr(pos=0, len);

pos 表示要从老字符串 str中提取的起始位置,即下标(默认为0)
len 表示新字符串的长度

6)查找字符串:str1.find(str2, pos);

用于在 str1字符串中查找 str2 字符串出现的位置

pos 表示开始查找的位置,即起始下标,默认为0
返回值为下标(类型是 int

str1.rfind(str2, pos);

pos 表示从 str1的起点开始查找,直到 pos 下标结束
返回值为下标(类型是 int

c语言<string.h>常用成员方法:

1)strlen求字符串长度:

int len1 = strlen(str1);

注意:strlen 的返回值是一个 size_t 类型,即无符号整数。 它的意义在于求长度时是不可能求出负数的,所以一定程度上优化了内存(使用有符号整形的话会浪费掉用来存储负数的空间)。

2)strcopy字符串拷贝

copy(str1,str2);

拷贝 str2指针指向的字符串至 str1指针指向的数组当中,拷贝的内容包含字符串终止符

注意:拷贝过去的内容是包含 '\0' 的。也就是说即使我拷贝过去的字符串长度没有数组原来的字符串长度长,但是我包含 '\0' 了,在 C 语言的角度来说 '\0' 之后的内容就不算从头往后看的字符串内容了。 

#include <stdio.h>
#include <string.h>
 
int main()
{
	char str1[20] = "row your boat";
	char str2[] = "hello world";
	strcpy(str1, str2);
	printf("%s\n", str1);
	return 0;
}
3)strncopy

strncpy 与 strcpy 的区别就是 strncpy 多了一个参数。这个参数是一个无符号的整数,即可以自定义拷贝多少个字节的内容。

#include <stdio.h>
#include <string.h>
 
int main()
{
	char str1[50] = "row row row your boat,";
	char* str2 = "gently down the stream";
	strcat(str1, str2);
	printf("%s\n", str1);
	return 0;
}
4)strcmp字符串的比较
#include <stdio.h>
#include <string.h>
 
int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret = strcmp(str1, str2);
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}
5)strncmp

strncmp 只是相较于 strcmp 多了一个参数,这个参数是一个无符号整数,代表的是字节。

#include <stdio.h>
#include <string.h>
 
int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret=strncmp(str1, str2,3);//我们只想比较字符串的前三个字节
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}
6)strcat字符串追加

将 str2 指针指向的字符串追加到 str1 指针指向数组并且有足够大的空间,其追加的位置是 destination 指针指向的字符串的 '\0' 处,即从这个位置拷贝。

#include <stdio.h>
#include <string.h>
 
int main()
{
	char str1[50] = "row row row your boat,";
	char* str2 = "gently down the stream";
	strcat(str1, str2);
	printf("%s\n", str1);
	return 0;
}
7)strncat

strncat 其参数多了一个无符号整形的参数,其意义代表字节数。即我们可以自定义想要追加多少个字符至另一个字符串的后面。

#include <stdio.h>
#include <string.h>
 
int main()
{
	char str1[50] = "row row row your boat,";
	char str2[] = "gently down the stream";
	strncat(str1, str2, 6);//我们只想追加 6 个字节的字符到 str1 中
	printf("%s\n", str1);
	return 0;
}
8)strstr字符串查找
#include <stdio.h>
#include <string.h>
 
int main()
{
	char* str1 = "row row row your boat,gently down the stream";
	char* str2 = "row your boat";
	char* ret = strstr(str1, str2);//在 str1 中查找 str2 
	printf("%s\n", ret);
	return 0;
}

字符串的多种赋值方式

//1.指针
char* a="abc";
//char *a={"abc"};
//char str[]="abc",*a=str;
//2.数组
char b[]="abc";
char name2[4]={'a','b','c','\0'};
//char name[4]={"abc"};
//char name="abc";这两种系统自动在末尾输入\0
//char name2="abc";报错 name2是char数组,abc是字符串
//3.字符串(c++中用法)
std::string name="hello";
//string有一个构造函数,接受char*或const char*参数

char name2[4]={'a','b','c','\0'};//这种形式必须加上'\0'才认为是一个字符串,否则是一个普通字符数组

字符数组作为字符串和指针指向字符串区别

mark中字符内容可以改变,mark却不能改变(是一个地址常量);

pmark本身可以加减,也可以指向其他常量,但是原来的字符串就无法使用了

指针、数组、string表示字符串所占字节差别

char* a="abc";
char name="abc";
char name2="abc";报错 name2是char数组,abc是字符串
std::string name="hello";

printf("sizeof(a)=%d\n",sizeof(a));
//占一个指针的字节,64位操作系统,,一个字节8位,8bit
printf("sizeof(name2)=%d\n",sizeof(name2));
//占整个数组的字节,数组大小决定 单指abc占用4字节(\0结尾)
printf("string:%d\n",sizeof(std::string));
//与系统有关,mac系统中所占字节24
printf("sizeof(name)=%d\n",sizeof(name));
//string仅有一个数据成员char*指针,所以和指针形式类似 与string所占字节相同

sizeof(a)=8
sizeof(name2)=4
string:24
sizeof(name)=24

连续输入一串字符串

//方法1:
#include<iostream>
int main()
{
	char str1[10] = { 0 };
	int i = 0;
	while ((str1[i] = getchar()) != '\n') {
		++i;
	}
	str1[i] = '\0';
	printf("%s", str1);
 
	return 0;
}
//方法二
#include<iostream>
int main()
{
	char str[15] = { 0 };
	gets(str);
	printf("%s", str);
 
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值