字符串相关知识及函数
1.补充字符串函数
字符串的定义
定义:用双引号(“”)括起来的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
浙公网安备 33010602011771号