字符串相关知识及函数

1.补充字符串函数

2.string::find,c++find 函数

字符串的定义

定义:用双引号(“”)括起来的0个或者多个字符组成的序列
存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志

字符串的有效长度只是有效字符的个数 不包括结尾的’\0’

#include<stdio.h>
int main()
{
	char q[] = "Hello";
	printf("%s %d\n", q, sizeof(q));//Hello 6
	
	const char* p = "Hello";
	printf("%s %d\n", p,sizeof(p));//Hello 4
	
	char a[10] = { "Hello" };
	printf("%s %d\n", a,sizeof(a));//Hello 10
	
    char a[10] = "Hello" ;
	printf("%s %d\n", a,sizeof(a));//Hello 10
	
	char m[10] = { 'H','e','l','l','o' ,’\0};
	//char m[10] = { 'H','e','l','l','o' };不是字符串
	printf("%s %d\n", m,sizeof(m));//Hello 10
	return 0;
}

字符串的输入:

C语言输入带空格的字符串
参考:https://blog.csdn.net/vincemar/article/details/78750435

因为:
scanf("%s",str); 遇到空格就停止接收后面的字符。
scanf("%s", str, 10); 不能接收带空格的字符串输入,虽然它的指定长度是10, 但是遇到空格时即使没有满10个字符它也自动结束输入了

所以:
1.用 gets() 可以读取空格, 直到回车才会结束输入

char str[80]gets(str);   //可以读取空格, 回车才会结束输入

2.使用"%[^\n]"可以接收输入带空格的字符串,直到回车才结束接收

char str[10];
scanf("%[^\n]",str); //可以读取空格,回车结束输入

c语言提供的字符串的函数

头文件#include<string.h>

strlen

获取字符串长度

#include <stdio.h>
#include<string.h>
int main()
{
	
	char str2[] = "world";
	int n = strlen(str2);
	printf("%d", n);//输出 5
	return 0;
}

strcpy

复制
c语言字符串不能直接用赋值语句,必须使用strcpy()函数

#include <stdio.h>
#include<string.h>
int main()
{
	char str1[20];
	char str2[] = "world";
	strcpy(str1, str2);
	//将str2复制到str1
	printf("%s", str1);//输出world
	return 0;
}

strcmp

比较大小
比较字符串的大小,是按字母表顺序比较,与长短无关

c语言中,不能直接使用str1>str2,必须使用函数strcmp();

strcmp(str1,str2);//括号里面要么传的是字符串的首地址 要么就是类似“hello”这样的常量字符串
e.char*s[]={....};
strcmp(s,"hello"};

//若str1>str2,则返回正值
//若str1=str2,则返回零
//若str1<str2,则返回负值

strcat

连接

#include <stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "hello";
	char str2[] = "world";
	strcat(str1, str2);
	printf("%s", str1);//输出helloworld

	return 0;
}

strchr和strrchr

查找字符

下面是 strchr() 函数的声明。

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

str – 要被检索的 C 字符串。
c – 在 str 中要搜索的字符。

strchr()是查找单个字符在串中第一次出现的位置。
返回值是一个内存地址,找不到返回NULL。
strrchr()是单个字符在串中最后一次出现的位置。

#include <stdio.h>
#include <string.h>

int main()
{
	char s[] = "hello";
	char c = 'e';
	printf("%d\n",strchr(s, c));//每次编译结果都不一样
	printf("%p\n", strchr(s, c));

    printf("%d\n",strchr(s, 'g'));
	printf("%p\n", strchr(s, 'g'));
	//int n = strchr(s, c)->这个是错的
	//输出<null> ,单步调试可以看出执行int *p=NULL,p的值为0x00000000,转成十进制就是0,
	
	
    printf("%d\n",strchr(s, c) - s);//1
	int n = strchr(s, c) - s;
	//前面两个不能这么写:好像不能拿char地址去初始化一个int
	//两个地址相减就是数组下标(s的地址就是s[0]地址
	
	printf("%d", n);
	/*其中一次编译结果:
		17825213
		010FFDBD
		0
		00000000
		1
		1*/
	return 0;
}

配上指针使用又是给字符截断的新方法

#include <stdio.h>
#include <string.h>

int main ()
{
   char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;

   ret = strchr(str, ch);

   printf("|%c| 之后(包含%c)的字符串是 - |%s|\n", ch,ch, ret);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

|.| 之后(包含.)的字符串是 - |.runoob.com|

strlwr和strupr

strlwr()将字符串中的字符转换为小写

strupr()将字符串中的字符转换为大写

#include<stdio.h>
#include<string.h>
int main(){
char str[] = “HTTP://see.xidian.edu.cn/cpp/u/shipin/;
printf("%s\n", strlwr(str));
printf("%s\n", str);
return 0;
}

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

只转换s参数中出现的大写字母,不改变其它字符。

所以strlwr()只能操作字符数组,而不能操作指针字符串,

因为指针指向的字符串是作为常量保存在静态存储区的,常量不能被修改

strupr()同理

以上两个函数完全可以手写

memchr

查找字符

C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前
n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。

该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。(和strchr好像是一样的)

#include<stdio.h>
#include<string.h>
//void *memchr(const void *str, int c, size_t n);
/*str -- 指向要执行搜索的内存块。
c -- 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
n -- 要被分析的字节数。*/
int main()
{
	const char* str = "HelloWorld!";
	char* pstr = 0;
	//pstr = (char*)memchr(str, '-', 100);//100那里填>=6都可
	//printf("%p\n", pstr);//00000000
	pstr = (char*)memchr(str, 'W', 100);//100那里填>=6都可
	printf("%p\n", pstr);//00D87BF1(每次编译不一样)
	if (pstr != 0) printf("找到字符W");//不是地址Null
	else printf("没找到字符W");
	return 0;
}

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   const char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;
 
   ret = (char*)memchr(str, ch, strlen(str));//这是一个地址
 
   printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
 
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

|.| 之后的字符串是 - |.runoob.com|

memset()

C 库函数 - memset()
C 标准库 - <string.h> C 标准库 - <string.h>
描述:
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

void *memset(void *str, int c, size_t n)

参数:
str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字符数。

返回值 该值返回一个指向存储区 str 的指针。

实例
下面的实例演示了 memset() 函数的用法。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

This is string.h library function
$$$$$$$ string.h library function

stoi(不同进制转换成十进制)和atoi(将字符串的十进制找出来)和atof

int m=stoi(str,0,10)==atoi(str)
c++函数:atoi和stoi

1.stoi()

标准库的函数默认模板

int stoi (const string& str//串, size_t* idx = 0//初始位置, int base =10//原字符串的进制);–>把各种进制直接转换成十进制

int stoi (const wstring& str, size_t* idx = 0, int base = 10);

2. atoi()

C 标准库 - <stdlib.h> C 标准库 - <stdlib.h>

描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

串前的空格处理:读字符,为空格则下标往后移 符号位处理:如果读到’+‘ ’-‘将符号记住然后继续后移 读数字 一直到出现非数字的字符截至
例如:’-1235hy12’=’ -1235hy12’=’-1235’(最终值)

int atoi(const char *str)

参数 str – 要转换为整数的字符串。

返回值 该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

实例
下面的实例演示了 atoi() 函数的用法。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int val;
   char str[20];
   
   strcpy(str, "98993489");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   strcpy(str, "runoob.com");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

字符串值 = 98993489, 整型值 = 98993489
字符串值 = runoob.com, 整型值 = 0

3.atof

函数atof

posted on 2020-12-12 16:24  不依法度  阅读(156)  评论(0)    收藏  举报

导航