字符串的全面解析

这篇具有很好参考价值的文章主要介绍了字符串的全面解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

字符串的赋值

  字符串的初始赋值两种:

  输出的形式:

  输入赋值四种方法:

  在函数中的赋值(复制):

小问题:

字符串处理函数string:

多维字符串:

为什么非要在字符串后加'\0'的问题。

子函数调用字符串:

字符串的错误使用方法:

通过单个元素的比较方式比较大小;


前言:

        首先我们需要了解什么是字符串;字符串本质上是一种以'\0'结尾的字符数组;其实我们所说的字符串,是用数组来保存字符的一种形式;这个数组里都是字符,所以我们把它称作字符串,但在C语言中,并没有字符串变量,仅仅是借用数组,来表示字符串

字符串的赋值

  字符串的初始赋值两种:

   第一种整体赋值:

char  a[]={"good morning"};//因为保存的是字符型的变量所以数组用char来定义;
char  b[]="good morning";//可以不加{}
    

这种形式会在最后一个字符的末尾加'\0',是以'\0'结尾的;

如果定义的字符长度小于数组的下标,则其他元素自动为'\0';

空格也算一个字符;

如果用这种方法来定义字符串,则定义的字符个数要少数组的下标,因为在末尾会自动加'\0';(当然'\0',也是会占一个字符的位置;'\0'为转义字符 null(空))

       编译器会在末尾自动添加'\0'是为了清楚,该字符串是在那里结束。'\0'作为字符串结束的标志。(具体为什么下面的多维数组讲解

           注:空格和'\0',并不是同一个东西。空格是字符;ASCII码是32,而'\0'是转义字符;ASCII码是0

   第二种单个元素赋值:

char a[]={'g','o','o','d'};//这种形式必须带花括号{};

这种形式末尾是没有'\0';的,相当于对数组中的每一个元素进行赋值。

能定义的字符个数就等于数组的下标值;(这种形式更准确的来说应该叫字符数组)

   第三种指针法:

char *p="hello";//定义一个指针指向一个字符串;
printf("%s",p);//输出字符串;
printf("%c",*(p+i));//单个字符输出;

指针p指向字符串的首地址,如果需要调用可以*(p+i)这种形式取其中的元素;或直接p输出这个字符串;

       虽然C语言中没有表示字符串的变量,但是有输出字符串形式的格式符“%s”

  输出的形式:

printf("%s",a);//将数组中的所有元素进行输出;
printf("%c",a[i]);//将数组中的第i个元素输出;
puts(a);//输出字符串;
putchar(a[i]);//单字符输出,一次输出一个字符;

  输入赋值四种方法:

     方式1.整体输入gets方式:

char s1[];//这里根据自己需求定义长度即可;
gets(s1);//直接输入字符串(字符串中可以加空格)

这种方式最简单实用,如果是多个字符串,那么需要有与之对应的gets();与之对应。

     方式2.单个字符赋值:

char s1[];
for(i=0;i<n;i++)
s1[i]=getchar();//一次只能接受一个字符,区分清楚getchar和putchar的形式;

输入时不要一个字符一个回车;回车和'/0'都是转义字符,也占位置;('\r':回车)

      方式3.整体输入,scanf形式:

char s1[];
scanf("%s",s1);//直接输入字符串中不可以有空格,末尾自动加'\0';(s1前不用加'&'取地址符)

  和其他变量赋值一样,用空格来分隔输入的变量;空格或回车结束输入;

多个字符串输入要有与之对应的'%s';切记'%s'之间不要乱加字符来分隔,如果加上,在输入过程中需要原样输入,区别中英文。不过可以加空格来隔开。

     方式4.单字符输入,scanf形式:

char s1[];
for(i=0;i<n;i++)
scanf("%c",&s1[i]);//如果是单字符输入需要加'&';

和方式2同理,不要一个字符一个回车;

  在函数中的赋值(复制):

1.单个元素复制:

char s1[50],s2[30]={"hello"};
for(i=0;s2[i]!='\0';i++)
s1[i]=s2[i];
S1[i]='\0';//根据需要在结尾加'\0',表结束;

2.利用库函数string:

#include<string.h>//使用前要声明;
char s1[50],s2[50]="hello";
strcpy(s1,s2);//s1必须是数组名且长度不低于被复制的字符串;
strcpy(s1,"hello");//s2可以是数组名,或者字符串常量;

将s2中的字符串包括'\0'全部复制过去;

小问题:

如果s1长度低于s2的长度,会出错,但是可以执行;且长度是被复制的长度,这里我不太清楚,有知道的大佬,可以留言解答一下;

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[3],s2[50]={"good boy"};
	int m;
	strcpy(s1,s2);
	m=strlen(s1);
	printf("%s\n%d",s1,m);
return 0;
}

字符串,c语言,c++

3.指针法赋值:

       其实和上述两种方法一样,只要清楚指针的指向,以及取值应用即可。

#include<stdio.h>
int main()
{
	int i;
	char s1[10],s2[20]="good man",*p1,*p2;
	p1=s1;p2=s2;
	for(i=0;s2[i]!='\0';i++)//s2[i]等于'\0'结束
	p1[i]=p2[i];
    puts(p1);
return 0;
}

字符串处理函数string:

再上面赋值时,提到过,使用前得声明

strcpy:用于字符串的复制,上面讲到了;

strlen:用于测量字符串长度;到'\0'结束,实际长度不包括'\0';也就是说如果字符串中间有'\0',会在此处结束;如上例图;形式为:strlen(s1);

strcat:用于字符串的连接;将s2接到s1后面;s1须足够长,再连接时,将s1中首个'\0'

去掉,将s2接到后面,保留s2的'\0';这里注意一下是碰到首'\0',  形式为:strcat(s1,s2);

strcmp:用于两个字符串的比较大小;形式为:strcmp(s1,s2)

s1=s2;//返回值为0;

s1>s2;//返回值为正整数;

s1<s2;//返回值为负整数;

字符串的大小问题:

有的小伙伴,可能不太清楚,sizeof和strlen的区别。

strlen是计算字符串的长度,它的计算方法是遇到'\0',就结束。

#include<stdio.h>
#include<string.h>
int main()
{
	char a[10]="abc\0lk";
	printf("%d",strlen(a));
	return 0; 
	}

这个的结果为3。

sizeof是计算字符串整体所占的内存单元,包括'\0'在内,查看一共占了多少内存单元。

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	char a[10]="abc\0lk";
	printf("%d",sizeof(a));
	return 0; 
	}

这个的结果为10。

多维字符串:

       一维数组构成一个字符串,多维数组,构成多个字符串,具体的个数取决于二维数组的行下表;

char s1[2][30]={"hello","world"};
char s2[2][30]={{'h','e','l','l','o'},{'w','o','r','l','d'}};

和上述的几种方法来赋值是一样;只要知道调用字符串时,调用的是他的数组名即可方便使用;

如 :strcmp(s1[0],s2[1]);

为什么非要在字符串后加'\0'的问题。

我们来看一个例子就清楚了;

#include<stdio.h>
int main()
{
	char s[2][5]={"good","boys"};
	printf("%s",s[0]);
return 0;
}

字符串,c语言,c++

#include<stdio.h>
int main()
{
	char s[2][5]={"good","boys"};
	s[0][4]='s';
	printf("%s",s[0]);
return 0;
}

 字符串,c语言,c++

       如果没有'\0';我们要想单个比较或使用某一个字符串,他就会顺带将其下一条也带上,因为没有'\0'作为结束标志,程序会接着输出或使用下一个字符串,直到碰到'\0'为止;

子函数调用字符串:

int fun(char s1[],char s2[])
{
	int i;
	if(strcmp(s1,s2)>0)return 1;
	else return 0;
}
int main()
{          
           int i=1,m;
	char s1[2][30]={"hello","world"},
     s2[2][30]={{'h','e','l','l','o'},{'w','o','r','l','d'}};
        m=fun(s1[1],s2[0]);
         printf("%d",m);
         return 0;
}

       传递的是字符串的首地址;在子函数中,定义好接收的类型,字符型数组,返回值看需要进行定义;如果是单独的字符,就和整型是一样的。

          如果传送的是单个字符的地址,那么就需要由一个字符型指针来接收

int fun(char *s1,char *s2)
{
	int i;
	if(*s1>*s2)return 1;
	else return 0;
}
int main()
{          
           int i=1,m;
	char s1[2][30]={"hello","world"},
     s2[2][30]={{'h','e','l','l','o'},{'w','o','r','l','d'}};
        m=fun(&s1[1][1],&s2[0][2]);
         printf("%d",m);
         return 0;
}

字符串的错误使用方法:

char s1[50];
s1="good";//错误的赋值方式;
s1=s2;//错误的赋值方式;

char s1[30]={"hello"},s2[30]={'w','o','r','l','d'};
if(s1>s2);//错误的比较方法;

如过不想通过调用字符串函数string来比较字符串的大小,可以这样;

通过单个元素的比较方式比较大小;

#include<stdio.h>
int main()
{
	int i=0;
	char s1[10]={"hello"},s2[20]="world";
 while((s1[i]!='\0')&&(s2[i]!='\0'))
	{ 
 if(s1[i]>s2[i])printf("s1>s2");
 if(s1[i]<s2[i])printf("s1<s2");
 i++;
 }
if(s1[i]==s2[i])printf("s1=s2");
return 0;
}

好了以上就是本章内容,如果错误地方,请立刻指正,谢谢。文章来源地址https://www.toymoban.com/news/detail-727117.html

到了这里,关于字符串的全面解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析C语言中的字符串输出操作

    在C语言中,字符串输出是常见的操作。本篇博客将详细讨论如何使用printf和puts函数输出字符串,以及字符串中的\\0字符和字符串操作结束标志的作用。 输出结果: hello c3 输出结果: hello c3 输出结果: hello c3 输出结果: hello 输出结果: 本篇博客详细讨论了C语言中字符串输

    2024年02月06日
    浏览(47)
  • OpenHarmony语言基础类库【@ohos.url (URL字符串解析)】

    说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 URLParams接口定义了一些处理URL查询字符串的实用方法。 constructor9+ constructor(init?: string[][] | Recordstring, string | string | URLParams) URLParams的构造函数。 系统能力:   System

    2024年04月28日
    浏览(46)
  • Go 语言内置类型全解析:从布尔到字符串的全维度探究

    关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 本文深入

    2024年02月09日
    浏览(51)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(45)
  • C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用

    在程序中,解析用户输入的参数(命令行参数)是很常见的操作,本文将讲解C语言中常见的一些解析字符串函数使用方法。 1 strchr 1.1 描述 strchr() 用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。其原型定义在头文件 string.h 中。 char *strchr(const ch

    2024年02月03日
    浏览(41)
  • mysql 解析json字符串、数组字符串、json数组字符串

    笔者使用mysql 5.7进行了一次json字符串的解析,因为一直在搞大数据相关的数据库、olap等,太久没有用mysql5.x的版本,一些函数已经不知道支不支持,我的同事建议我使用like、rlike模糊匹配的方式,身为数据人我不太喜欢用这种手段,因为他们比较低效。于是我想这里总结一下

    2024年02月16日
    浏览(56)
  • 一个退役中校教你如何用go语言写一个基于B+树的json数据库(进阶篇)之json字符串解析为BsTr结构(一)

    1.对象式json字符串 s := \\\"{\\\"put\\\":{\\\"putjsontest\\\":{\\\"aaa\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"aaab\\\":true,\\\"arrarrstrct\\\":{\\\"nnn\\\":-1234567890,\\\"ccc\\\":[[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"nmbndfvdfgfdg\\\"],[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"poiuiyyttt\\\"]]},\\\"ddd\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"fff\\\":false,\\\"comboolarr\\\":[{\\\"boolarr0\\\":[true,false]},{\\\"boolarr1\\\":[true,false]}]}

    2024年02月21日
    浏览(52)
  • 字符函数和字符串函数解析及模拟实现

    字符串以’\\0’作为结束标志,strlen函数返回的是在字符串中’\\0’前面出现过的字符个数(不包括’\\0’)。 参数指向的字符串必须以’\\0’结束。 注意函数的返回值位size_t, 是无符号的 。 Copies the C string pointed by source into the array pointed by destination, including the terminating null c

    2024年02月16日
    浏览(47)
  • 解析GPS数据(长字符串解析示例)

    这里GPS一般返回的都是大量的数据,而且是一行行的那种,大部分数据也不太用的到,所以这个时候用串口DMA空闲中断其实就意义不大,这样我们就可以用一种新的思路来进行数据解析,专门针对这样的数据!!! 这里我用的大概长这样,还有很多其他版本的,不过区别不大

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包