7.字符串与字符数组

字符串与字符数组

1.1字符数组定义

char array[100];

1.2字符数组初始化

char array[100]={'a','b','c','d'};
char array[100]="abcd";
char array[100]={0};
char array[]="abcd";

1.3随机数产生函数rand与srand

  • 头文件stdlib.h

  • rand是伪随机数产生器,每次调用rand产生的随机数都是一样的

  • 如果调用rand之前先调用srand就出现任意的随机数

  • 只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数

#include <stdio.h>
#include <time.h>
#include <stdlib.h>//调用随机数的头文件
//* rand是伪随机数产生器,每次调用rand产生的随机数都是一样的
//* 如果调用rand之前先调用srand就出现任意的随机数
//* 只要能保证每次调用srand函数的时候, 参数的值是不同的, 那么rand函数就一定会产生不同的随机数
int main() {
	int t = (int)time(NULL);
	srand(t);//可以尝试将这个注释,这个是调用time这个函数的。
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", rand());
	}
return 0;
}

1.4用scanf输入字符串

字符串的结束标志
scanf将回车, 空格都认为是字符串输入结束标志.

#include <stdio.h>

int main() {
	char s[10] = { 0 };
	scanf("%s", s);//"%s"的作用就是输入一个字符串的,scanf是以回车键作为输入完成标示的,但回车键本身并不会作为字符串的一部分
//如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就会缓冲区溢出,导致程序崩溃
	int i;
	for (i = 0; i < 10; i++) {
		printf("%d\n", s[i]);
}
	printf("----------------------------------\n");
	printf("%s\n", s);
	return 0;
}

2、字符串处理函数

2.1、gets

#include <stdio.h>
int main() {
	char s[100] = { 0 };
	gets(s);//gets认为回车的输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串
	//gets和scanf一样存在缓冲区溢出的问题
int i;
for (i = 0; i < 10; i++) {
	printf("%d\n", s[i]);
}
printf("----------------\n");
printf("%s\n", s);
    }
//gets不能用类似'%s'或者'%d'之类的字符转义,只能接受字符串的输入*/

/*//

2.2、fgets函数

讲解视频01:11:34

gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便

char s[100] = { 0 };
fgets(s, sizeof(s), stdin);

stdin 是标准输入,一般指键盘输入到缓冲区里的东西。

2.2.1、gets 与 fgets 的区别:

比如我定义了一个
char x[5];
gets(x);//如果我输入超过五个字符,如,abcdefg。那么程序会报错的
而fgets则不会
fgets(x, sizeof(s), stdin);//如我输入:abcdefg,它就只会显示abcd。

2.3、puts

//puts函数打印字符串,与printf不同,puts会在最后自动添加一个'\n'
//也就是说,与printf类似,但是它会自动换行

#include <stdio.h>

int main() {
	char s[] = "hello world";
	puts(s);
return 0; 
}

2.4、strlen,字符串长度

#include <stdio.h>
int main() {
	//strlen, 字符串长度
//size_t strlen(const char* _Str); 返回不包含字符串结尾'\0'的字符串长度
	char s[100] = "hello world!";
	int len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0)
	printf("%d\n", len);
	return 0;
}
/*#include <stdio.h>
int _Str1(const char* _Str) {
	int len = 0;
	if (_Str != NULL) {
		while ((*_Str++) != '\0')
			len++;
	}
	return len;
}

int main() {
	char s[100] = "hello world!";
	int len = _Str1(s);
	printf("%d\n", len);
	return 0;
}*///_Str1与前面的strlen用法是一样的,不一样的是,这个是自己定义的函数

/*

2.5、strcat,字符串追加

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//strcat, 字符串追加

int main(){
	//size_t strcat(char* _str1,const char* _str2) 将参数_str2追加到_str1后尾
	char s[128] = "Hello World!";
	int len = strlen(s);//计算s字符串长度,返回一个字符串中的有效字符数量(不包含字符串结尾的0)
	printf("len=%d\n", len);
	char s1[100] = "abc123321";
	strcat(s, s1);//将两个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题
	printf("%s\n", s);
	return 0;

}
//自定义strcat函数实现
void _strcat(char* _str1, const char* _str2) {
	if (_str1 != NULL && _str2 != NULL) {
		while (*_str1 != '\0')
			_str1++; //循环至str1字符串末尾
		while (*_str2 != '\0')
			*_str1++ = *_str2++; //把字符串_str2里面的内容存储至_str1中
		*_str1 = '\0';//结尾str1赋值'\0'表示字符串结束
	}
}

或者

#include <stdio.h>
#include <string.h>
int main(){
	char a[100] = "hello world";
	char b[100] = "123456abc";
	int len = strlen(a);		//计算有效字符串长度
	for (size_t i = 0; i < strlen(b); i++)//将超出的长度的无效字符串,拼接上字符数组b里面有效的字符串。
	{
		a[len + i] = b[i];
	}
	printf("%s\n", a);
}

2.6、strncat, 字符串有限追加

size_t strncat(char* _str1,const char* _str2,size_t len)
char s[128] = "hello";
char s1[50] = ",world!!!";

strncat(s, s1, 5);
printf("%s\n", s);
//自定义strncat函数实现
void _strncat(char* _str1, const char* _str2, size_t len){
	if (_str1 != NULL&&_str2 != NULL){
		while (*_str1 != '\0')_str1++;
		for (int i = 0; i < len; i++){
			*_str1++ = *_str2++;
		}
	}
}

2.7、strcmp, 字符串比较

//int strcmp(const char* _str1,const char* _str2);
#include <stdio.h>
#include <string.h>
int main() {
//比较两个字符串是否相等,相等返回0,不等返回非0
char a[128] = "abcdefg";
char b[128] = "abcdef";
printf("%d\n", strcmp(a, b));//a>b大于:1  a=b等于:0 a<b小于:-1
return 0;
}
//自定义strcmp函数实现
int _strcmp(const char* str1,const char* str2){
int ret = 0;
if (str1 != NULL&&str2 != NULL){
	while (!(ret = *str1 - *str2) && *str1){
		str1++;
		str2++;
	}
}
if (ret > 0)
	return 1;
else if (ret < 0)
	return -1;
return 0;
}

2.8、strncmp, 字符串有限比较

	//	int strcmp(const char* _str1, const char* _str2, size_t len);
	char a[128] = "abcdefg";
	char b[128] = "abcdef";
	int len = 7;
	printf("%d\n", strncmp(a, b, len));//>大于:-1  等于:0 小于:1

2.9、strcpy字符串拷贝

//int strcpy(const char* _str1, const char* _str2, size_t len);

char a[128] = "abcdefg";
char b[128] = "hijklnm";
printf("%s\n", strcpy(a, b));//会将b的数据复制到a的数据
printf("%s\n", a);
//自定义strcpy函数实现
void _strcpy(char* _str1,const char* _str2){
	if(_str1!=NULL&&_str2!=NULL){
 		while((*_str1++=*_str2++)!='\0')
	}    
}

2.10、strncpy字符串有限拷贝

2.11、sprintf,格式化字符串

和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串

char str[128];
sprintf(str, "Hello World!\n");//将结果存在str里面。
printf("%s\n", str);
//编号加内容。
//平常:
for (size_t i = 0; i < 100; i++)
{
	printf("%d:%s\n", i,"Hello World!");//无可修改的字符变量
}
//用sprintf:
for (size_t i = 0; i < 100; i++)
{
	sprintf(str, "%d:Hello World!\n",i);//str可修改
	printf("%s\n", str);
}

2.12、sscanf函数

sscanf不同于scanf函数, ,scanf从键盘读取用户输入,sscanf从指定格式化字符串读取输入

//爬虫  模拟用户去批量下载网站、信息、内容、图片、素材
char str[] = "http://www.netbian.com/desk/22925.htm";
char s[128];
sscanf(str, "%[a-z]", s);//"%[a-z]"是指筛选a到z的字母字符
printf("%s\n", s);
char s[128] = "10 0x10 aabc";
int x, y;
char b[100];
sscanf(s, "%d %X %[a-z]", &x, &y, b);//将整型存在x中,将16进制的存在y中,将字母只有a到z的字符存在b中。
printf("%d\n", x);//
printf("%x\n", y);
printf("%s\n", b);

2.13、strchr查找字符

//char * strchr(char * _Str, int _Ch);
//在参数_str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;
char Str[128] = "Hello World!";
int a = strchr(Str, 'o');

printf("%s\n", (strchr(Str, 'W') + 3));
printf("%c\n", *(char*)(strchr(Str, 'W') + 3));//*(char*)是让它只输出一个字母
//自定义strchr函数实现
char *strchr(const char* _str1, int ch) {
	if (str1 != NULL) {
		while (*_str1++ != '\0') {
			if (*_str1 == ch) {
				return (char*)_str1;
			}
		}
	}
	return NULL;
}

2.14、strstr,查找

strstr:char* strstr(char* _str,const char* _substr)
//在参数_str中查找参数_substr指定子串,找到返回子串在_str中所在位置,没有找到返回NULL
char Str[128] = "ldkfjeljaljfe";
char a[10] = "fj";
printf("%s\n",strstr(Str, a));
//爬虫可以用:
char str[] = "http://www.xinhuanet.com/politics/leaders/***/jhqw.htm";
char http[128] = "www";
printf("%s\n", strstr(str, http));
//自定义strstr函数实现
char* _strstr(char* _str, const char* _substr) {
	if (_str != NULL && _substr != NULL) {
		int lenstr = strlen(_str);
		int lensub = strlen(_substr);
		if (lenstr < lensub)
			return NULL;
		int i, j;
		for (i = 0; i < lenstr - lensub; i++) {
			for (j = 0; j < lensub; j++) {
				if (_str[i + j] != _substr[j])
					break;
			}
			if (j == lensub)
				return &_str[i];
		}
	}
	return NULL;
}

2.15、strtok分割字符串

字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针

char str[] = "abc@defg@igk";
	char* p = strtok(str, "@");
	printf("%s\n", p);//就会截取到abc
//与前面的strstr合用。我们只要www,baidu.com
char strh[] = "http://www.xinhuanet.com/politics/leaders/***/jhqw.htm";

char str1[128];
sprintf(str1,strstr(strh, "www"));
char str2[128];
sprintf(str2,strtok(str1, "/"));
printf("%s\n", str2);
//或者
char www[30] = "www";
char* po = strstr(strh, www);
po = strtok(po, "/");
printf("%s\n", po);

atoi转化为int atof转化为float atol转化为long
需要包含头文件stdlib.h

posted @ 2020-10-26 15:59  onedust  阅读(204)  评论(0)    收藏  举报