当前位置 : 主页 > 编程语言 > c语言 >

C语言

来源:互联网 收集:自由互联 发布时间:2023-09-07
指针-指针得到的是指针之间的元素个数,不是字节个数 字符串追加 strcat 和strncat 自己给自己追加的时候,strcat会崩溃因为首字母是把\0替换掉 strncat就可以 strcat(Den , Sour); strncat(De

指针-指针得到的是指针之间的元素个数,不是字节个数

字符串追加 strcat 和strncat

自己给自己追加的时候,strcat会崩溃因为首字母是把\0替换掉

strncat就可以

strcat(Den , Sour);

strncat(Den,sour,count);

strstr(Den,Sour)找子串的   如果找到了返回Den字符的地址,找不到返回空指针

C语言_字符串

字符串---常量字符串,字符串数组 ,如果能成为字符串,则字符串的末尾必定会存放一个\0;

字符串长度--strlen

strlen的返回值是size_t(是无符号整形)


长度不受限制的字符串---strcpy,strcmp,strcat

strcpy注意事项,1. 源地址必须要以'\0'结束,并且拷贝的时候会把'\0'拷贝到目标空间去    2. 目标空间必须足够大,确保源字符串能够存储   3.目标空间必须可变

//该arr1不可变,因为arr1内是常量字符串
char *arr1="abcdef";
//该arr2里可变
char arr2[]="abcdef";

 strcat注意事项,1.   目标空间必须足够大,确保源字符串追加在目标字符串处仍能存储    2.   源头和目的地都要包含'\0',而且源头的'\0'会拷贝到目的地中。

strcmp注意事项  1. arr1>arr2返回大于零的数,arr1<arr2返回小于零的数 arr1=arr2返回零,返回类型是int


长度受限制的字符串---strncat,strncpy,strncmp

char* strncpy(const char* str1,const char* str2, size_t count)

strncpy :拷贝num个字符,从源字符到目标空间

如果源字符串的长度小于num,则拷贝完字符串后,在目标的后面追加0直到num个

char* strncat(const char* str1,const char* str2, size_t count)

strncat: 追加n个字符,如果追加的n比arr2要短,追加之后自动补一个‘\0’,如果比arr2要长,则追加arr2之后补一个‘\0’之后就不管了。

int strncmp(const char* str1,const char* str2, size_t count)

strncmp : 比较到一个字符串结束或者出现另个字符不一样或者num个字符全部比较完。


字符串查找---strstr,strtok

strstr :查找字符串  如果没有查找到返回的是空指针,如果查找到了,返回的是查找到的字符串的地址

int main() {
	char* p1 = "abcdefabcdef";
	char* p2 = "de";
	char* ret = strstr(p1, p2);//返回的是defabcdef ,返回的是在p1中首次出现的字符串地址,打印p1后面的所有元素
	if (ret==NULL) {
		printf("查不到该字串");
	}
	else {
		printf("%s\n",ret);
	}
	return 0;
}

strtok

char* strtok(char* str,const char* sep)

sep参数是个字符串,定义了用作分隔符的字符集合

注意事项: 

  1. 第一个参数指定一个字符串,他包含了0个或者多个由sep字符串中1个或者多个分隔符的标记  
  2. strtok找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针(strtok会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)
  3. 若strtok函数第一个参数不为NULL时,函数将找到str中的第一个标记,str函数将保存他在字符串中的位置
  4. 若strtok函数第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始找下一个标记
  5. 如果字符串不存在更多的标记,则返回NULL指针
  6. 第一个参数为NULL的strtok函数会匹配距离它最近的第一个参数不是NULL指针的strtok。

 

错误信息报告---strerror

char* strerror(int errnum);

strerror:返回错误码对应的信息

int main() {
	//错误码   错误信息
	//0 -      No error
	//1 -      Operation not permitted
	//2 -      No such file or directory
	//...      ...
	//全局的错误变量/错误码的变量
	//当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码赋值到errno中
	/*char* arr = strerror(errno);
	printf("%s\n", arr);*/
	FILE* pf=fopen("text.txt","r");
	if (pf==NULL) 
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		printf("open file success");
	}
	return 0;
}


字符分类函数

字符做操作

int main() {

	char ch = 'w';
	//如果是小写字母返回非零值,如果不是小写字符返回0;
	int ret = islower(ch);
	//十进制数字0-9
	int ret1 = isdigit(ch);
	//空白字符“空格” 换页"\f" 换行"\n"  回车"\r" 制表符"\t" 垂直制表符"\v"
	int ret1 = isspace(ch);
	//十六进制包括a-f A-F
	int ret1 = isxdigit(ch);
	//任何控制字符
	int ret1 = iscntrl(ch);
	//大写字母A-Z
	int ret1 = isupper(ch);
	//字母a-z,字母A-Z
	int ret1 = isalpha(ch);
	//字母或者数字 a-z,字母A-Z  数字0-9
	int ret1 = isalnum(ch);
	//标点符号,任何不属于数字或者字母的图形字符
	int ret1 = ispunct(ch);
	//任何图形字符
	int ret1 = isgraph(ch);
	//任何可打印字符包括图形字符和空白字符
	int ret1 = isprint(ch);
	int ret1 = printf("%d\n", ret);
  	//字符转换
	//tolower--转小写字母
	//toupper--转大写字母
	
	//如果是小写不动,大写转化为小写
	char ch = tolower('Q');
	//printf("%c\n",ch);
	putchar(ch);

	return 0;
}

strcat strcpy strcmp---操作对象是字符串   ‘\0’

整形数组,浮点型数组,结构体数组就不能用'\0'了;


内存操作函数---memcpy,memmove,memset,memcmp

memcpy -- 内存拷贝:即能拷贝整形,浮点型,结构体,字符串

void* mencpy(void* dest,const void* source,size_t num/*单位是字节*/)

如果使用memcpy拷贝时,两个字符串要是有交集,因为会被覆盖(但是可以成功,vs2013可以胜任这个工作)---c语言标准,memcpy只要处理,不重叠的内存拷贝就可以

memmove -- 处理重叠内存的拷贝

void* men(void* dest,const void* source,size_t num/*单位是字节*/)

memcmp---内存比较,比较结果和strcmp的结果是一样的

void* mencmp(void* dest,const void* source,size_t num/*单位是字节*/)
  int main() {
	int arr1[] = { 1,2,3,5,6,7,8,9 };
	int arr2[] = { 1,2,3,6,3,1,0,9 };
	int ret = memcmp(arr1, arr2, 8);//8的单位是字节---结果是0---如果输入的是16则arr1和arr2的第四个不相同则会返回-1
	printf("%d\n", ret);
	return 0;
}

memset---设置一个缓冲区为一个特定的字符

void* memset(void* dest,int c,size_t count)

dest----是目标字符串(那块空间进行设置)   c-----设置的字符是什么   count-----要设置多少个字符

注意事项----count的单位是字节

int main() {
	char arr[10] = "";
	int arr1[10] = { 0 };
	memset(arr,'*',7);
  //01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00...
	memset(arr1, 1, 10);//这种情况只能改掉前两位,和第三位的前两个字节,而且输出的之是16843009,并不是1
	return 0;
}



NULL---空指针

NUL/Null---‘\0’;








上一篇:数据结构--&gt;用队列实现栈(OJ_01)
下一篇:没有了
网友评论