【C语言】字符串---刷题篇

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

Hi,C站的小伙伴们大家好呀!😊🥰,欢迎来阅读我的这一篇 【C语言】字符串基础刷题篇!
不知你是否和我一样,在刚刚接触到这块的知识时,总是会和这神圣的知识隔着隔着厚厚的一堵墙,迷茫的眼神中总是会露出不理解不理解😣😣(当时的状态……)
其实后来我就发现其实字符串呢,就是将其存储在字符数组中,然后就把字符串当作特殊的数组来处理就好了。它们在本质上都是一样的,在存储时,系统为它们分配连续的存储空间,正是由于这个特点,对于它们的访问“读”操作很方便,只用下标就可以访问目标元素了。
当然,字符串也有比较独特的地方,这正是我们需要进一步学习掌握的,尤其是一些字符串处理函数,通过使用它们,可以完成特定的功能,简化代码。
好啦,接下来就让我们一起进入字符串的世界吧!💕💕



写在前面的话:
字符串常量是由一对双引号括起来的字符系列。字符串存储时,字符串的每个字符在内存中连续存储,在字符串的尾部自动存储字符串结束标志’\0’。
在处理字符串时只需知道该字符串的第0个字符的指针,借助字符连续存储的特性以及字符串的结束标志,就可以遍历字符串中的每个字符,C系统对字符串的处理实际上是按照指针处理的。
C语言中,没有字符串变量的概念,只要能够表示字符串中第0个字符的指针就可以达到表示字符串常量的目的。



统计字符串中元音字母的字数

#include <stdio.h>
int main (void)
{
	char str[128]={0};//给字符串数组初始化为一个空字符串
	int count=0,i;
	printf("请输入一个字符串:\n");
	gets(str);
	for (i=0;str[i]!=0;i++)
		if (str[i]=='a'|| str[i]=='e'|| str[i]=='i'|| str[i]=='o' || str[i]=='u')
			count++;
	printf("%d\n",count);
	return 0;
}

使用起泡法和选择法将字符串按ASCII码值从小到大排列

#include <stdio.h>
#include <string.h>
int main (void)
{
	char str[128]={0};//给字符串数组初始化为一个空字符串
	int count=0,i,k;
	char temp;//设置中间变量
	printf("请输入一个字符串:\n");
	gets(str);
	//选择法排序
	for(i=0;i<strlen(str);i++)
		for (k=i+1;str[k]!=0;k++)
			if (str[k]<str[i])
			{
				temp=str[i];
				str[i]=str[k];
				str[k]=temp;
			}
	for (i=0;str[i]!=0;i++)
		printf("%c",str[i]);
	printf("\n");
	return 0;
}
#include <stdio.h>
#include <string.h>
int main (void)
{
	char str[128]={0};//给字符串数组初始化为一个空字符串
	int count=0,i,k,n;
	char temp;//设置中间变量
	printf("请输入一个字符串:\n");
	gets(str);
	n=strlen(str);//求字符串的长度
	//起泡法排序
	//一共进行n-1次比较
	//分析:第1趟,进行n-1次比较(最后一次是n-2与n-1比较);
	//第2趟,进行n-2次比较(最后一次是n-3与n-2比较)
	for (i=1;i<n;i++)
		for (k=0;k<n-i;k++)
			if (str[k]>str[k+1])
			{
				temp=str[k];
				str[k]=str[k+1];
				str[k+1]=temp;
			}
	for (i=0;str[i]!=0;i++)
		printf("%c",str[i]);
	printf("\n");
	return 0;
}

将字符串中的数字字符倒置

将字符串中的数字字符倒置,即‘0’变‘9’、‘1’变‘8’、…、‘9’变‘0’.例如:字符串“a1b2c3d4e9f0”倒置变为“a8b7c6d5e0f9”
这个题主要利用字符0~9的ASCII码值,字符’0’的ASCII值为48,依次,’1‘为49……’9‘为57

#include<stdio.h>
int main(void)
{
	char str[128]={0};
	int i;
	printf("请输入一个含有数字的字符数组:\n");
	gets(str);//输入str
	for (i=0;str[i]!=0;i++)
		if (str[i]>=48 && str[i]<=57)//判断是否是字符0~9
			str[i]=105-str[i];//对应项的ASCII值相加为105
	for (i=0;str[i]!=0;i++)//输出字符串
		printf("%c",str[i]);
	return 0;
}

将一个字符串中从第m个字符开始的全部字符复制成为另一个字符串

#include <stdio.h>
int main (void)
{
	char str1[128]={0},str2[128]={0};//字符数组初始化为一个空字符串
	//将要输出的字符串放到字符数组str2中
	int m;
	int i,k=0;
	//输入数据
	gets(str1); //输入字符串
	scanf("%d",&m);//输入m
	//第m个字符串的下标为m-1
	for (i=m-1;str1[i]!=0;i++)//依次将m个字符之后的字符“移到”str2中
	{
		str2[k]=str1[i];
		k++;
	}
	printf("%s\n",str2);//输出str2
	return 0;
}

一点改进:
前面几个程序都是利用循环输出的字符串,即对字符数组中的元素依次进行输出。(我当时的顾虑:因为定义的字符数组比较大,后面的全为“0”,可能0也会输出?)
但自己对“0”的理解不对,字符数组的“0”即是"\0"(字符串结束的标志),而不是字符’0‘;
所以由于前面定义时就对str2进行了初始化,使得str2中的每一个元素都是’\0‘,当对str2中的元素依次赋值,直到赋值结束,其后面的为赋值的位置都是’\0’,直接用printf()函数输出字符串即可。

有10个字符串,每个字符串表示一段文字,将10个字符串连接成一篇文章,保存到一维数组并输出。

#include <stdio.h>
#include <string.h>
int main (void)
{
	char str[10][128]={0};//二维数组全部初始化为0
	char str2[128]={0};//将最终连接好的文字放入一维数组
	int i;
	//将二维数组看作是特殊的一维数组,分别是str[0]、str[1]…str[9]
	for (i=0;i<10;i++)
		gets(str[i]);//输入10组文字
	for (i=0;i<10;i++)
		strcat(str2,str[i]);//利用字符串连接函数,依次连接
	printf("%s\n",str2);
	return 0;
}

在全班50个学生的姓名中,查找指定姓名的学生,若找到则输出该学生姓名,否则输出无此人。

#include <stdio.h>
#include <string.h>
#define count 5
int main (void)
{
	char str[count][128]={0};//二维字符数组初始化
	char name[128]={0};//要输入的名字
	int i ,flag=0;//flag为标志量
	for (i=0;i<count;i++)
		gets(str[i]);//依次输入班级所有同学名字
	gets(name);// 输入要查找的名字
	for (i=0;i<count;i++)
		if (strcmp(str[i],name)==0)//字符串比较
		{flag=1;
		break;//若两个字符串相等,跳出循环
		}
	if (flag==1) //根据标志量判断
		printf("%s\n",name);
	else
		printf("无此人\n");
	return 0;
}

写一个函数,将两个字符串连接.

分析➰在自定义函数concatenate中,先将第一个字符串str1的每个元素依次放到str3中,然后接着,将str2中的每个元素放到str3中。

#include <stdio.h>
#include <string.h>
void concatenate(char str1[],char str2[],char str3[]);
int main (void)
{
	char str1[128]={0},str2[128]={0},str3[128]={0};
	gets(str1);
	gets(str2);
	concatenate(str1,str2,str3);
	printf("%s\n",str3);
	return 0;
}


void concatenate(char str1[],char str2[], char str3[])
{
	int i,n,k=0;
	n=strlen(str1);
	for (i=0;str1[i]!=0;i++)
		str3[i]=str1[i];
	for (i=n;str2[k]!=0;i++)//从第n个开始存放str2
	{
		str3[i]=str2[k];
		k++;
	}
}

写一个函数,将一个字符串中的元音字母复制到另一个字符串中,然后输出。

➰已知一个字符串str1,然后对该字符串中的每个元素依次判断是否是元音字母,如果是,依次存放到str2中。

#include <stdio.h>
#include <string.h>
void copy(char str1[],char str2[]);
int main (void)
{
	char str1[128]={0},str2[128]={0};
	printf("Please input str1:\n");
	gets(str1);
	copy(str1,str2);//数组名作为实参传递给形参
	printf("%s\n",str2);
	return 0;
}
void copy(char str1[],char str2[])
{
	int i,k=0;
	for (i=0;str1[i]!=0;i++)
		if (str1[i]=='a'||str1[i]=='e'||str1[i]=='i'||
		str1[i]=='o'||str1[i]=='u'||str1[i]=='A'
		||str1[i]=='E'||str1[i]=='I'||str1[i]=='O'||str1[i]=='U')
		{
			str2[k]=str1[i];
			k++; //如果是元音字母,放到str2中
			//且移到下一个元素进行赋值
		}
}

使用字符串处理函数

1.puts函数——输出字符串的函数

下面编写一个简单的程序:

#include <stdio.h>
int main (void)
{
	char str[128]={"helloword"};
	puts(str);//用puts函数输出字符串"helloworld"
	return 0;
}

运行结果如下:
【C语言】字符串---刷题篇
用printf()函数输出:

#include <stdio.h>
int main (void)
{
	char str[128]={"helloword"};
	printf("%s",str);
	return 0;
}

运行结果如下:
【C语言】字符串---刷题篇

用puts函数在输出时,将字符串结束标志’\0’转换成’\n’,即输出完字符串后换行。
相当于printf(“helloword\n”)

即:

#include <stdio.h>
int main (void)
{
	char str[128]={"helloword"};
	printf("%s\n",str);
	return 0;
}

【C语言】字符串---刷题篇
由于可以用printf()函数输出字符串,因此puts函数用得不多。

2.gets函数——输入字符串的函数

gets函数的作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。

char str[128]={0};
gets(str);

从键盘输入:

computer

gets函数将从键盘读入的“computer”送入字符数组中。

3.strcat——字符串连接函数

其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中。
说明:
字符数组1必须足够大,以便容纳连接后的字符串。
连接前两个字符串的后面都有’\0’,连接时将字符串1后面的‘\0’取消,只在新字符串最后面保留’\0’。

4.strcpy——字符串复制函数

5.strcmp——字符串比较函数

其作用是比较字符串1和字符串2。
字符串比较的原则是,将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或者‘\0’为止。
如全部字符相同,则认为两个字符串相等;
若·出现不相同的字符,则以第一对不相同的字符的比较结果为准。

6.strlen——字符串长度函数
其功能是计算字符串的长度。
返值:返回字符串实际长度的值,不包括’\0’在内。
这里需要注意的是,要和sizeof()函数做区分,strlen()函数的功能是计算字符串的长度,而sizeof()函数是计算字节数,以数组为例,若除以元素类型所占的字节数,那么就会得到数组的长度。

#include <stdio.h>
#include <string.h>
int main (void)
{
    char a[]="China";
    int m,n;
    n=strlen(a);     //n为5
    m=sizeof(a);     //m为6
    printf("strlen(a)=%d,sizeof(a)=%d",n,m);
    return 0;
    
}

还有这里需要学习掌握的是计算字符串的长度。
下面引入例题,分别计算字符串的长度:

    char s[10]={'A','\0','B','C','\0','D'};
    char s1[]="\t\v\\\0will\n";
    char s2[]="\x69\082\n";
strlen(s)=1;
strlen(s1)=3;
strlen(s2)=1;

这里需要知道一些常见的转义字符,如下表:

\n 回车换行
\t 横向跳格到本行的下一个输出取
\a 响铃控制符
\ ‘’ 双引号
\r 回车
\b 退格
\\ 反斜线符
\’ 单引号
\v 垂直制表符

但是对于s2?\x89?这就需要字符常量的几种表示方法了。文章来源地址https://www.toymoban.com/news/detail-439202.html



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

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

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

相关文章

  • 算法刷题-字符串-翻转字符串里的单词

    综合考察字符串操作的好题。 力扣题目链接 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: “the sky is blue” 输出: “blue is sky the” 示例 2: 输入: \\\" hello world! \\\" 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不

    2024年02月09日
    浏览(87)
  • 【算法刷题之字符串篇】

    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 1.将 left 指向字符数组首元素,right 指向字符数组尾元素。 2.当 left right: 交换 s

    2024年02月10日
    浏览(31)
  • 力扣刷题笔记-08 字符串转整数

    属于对字符串进行操作的问题 百无一用是情深 字符串里有数字,空格,正负号等,需要先过滤出来 在这道题目里,我们通常考虑字符串的组合是 “空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。 for循环

    2024年02月08日
    浏览(29)
  • LeetCode刷题——394. 字符串解码(HOT100)

    ✊✊✊🌈大家好!本篇文章将较详细介绍栈的题目 394. 字符串解码 ,提供 栈和递归 两种解法。代码语言为: C++代码 😇。 🔒1、题目: 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string] ,表示其中方括号内部的 encoded_string 正好重复 k 次。注

    2024年01月19日
    浏览(44)
  • JAVA刷题之字符串的一些个人思路

    感谢您的阅读! ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人

    2024年02月05日
    浏览(30)
  • 【刷题】 leetcode 面试题 01.06 字符串压缩

    来看题目: 根据题目所说,我们需要完成函数书写,保证返回一个相对较小的字符数组: 如果压缩后比原字符串小,则返回压缩字符串,否则返回原字符串。 本思路一步一步操作,逐步完成任务 先确认字符串长度是否小于 2 ,小于直接返回( 因为压缩字符串长度至少是2

    2024年01月24日
    浏览(35)
  • 第8天-代码随想录刷题训练-字符串● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串

    LeetCode链接 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 swap常见的两种交换形式 常见的值交换 通过位运算 LeetCode链接 给定一个

    2024年02月04日
    浏览(42)
  • Java字符串常用函数 详解5000字 (刷题向 / 应用向)

    直接定义字符串是指使用双引号表示字符串中的内容,例如\\\"Hello Java\\\"、\\\"Java 编程\\\"等。具体方法是用字符串常量直接初始化一个 String 对象,示例如下: 1.    String str=\\\"Hello Java\\\"; 或者 1.    String str; 2.    str=\\\"Hello Java\\\"; 注意:字符串变量必须经过初始化才能使用。 String str2

    2024年02月05日
    浏览(32)
  • 算法刷题|583.两个字符串的删除操作、72.编辑距离

    题目:给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 dp[i][j] 表示以i-1结尾的word1子序列和以j-1结尾word2变成相同所需要的最小的步数为dp[i][j] 递推公式:分两种情况,word1.charAt(i-1) 和 word2.charAt(j-1)是否

    2024年02月08日
    浏览(30)
  • 【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

    以下是能用KMP求解的算法题,KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 题目链接:28. 找出字符串中第一个匹配项的下标 题目内容: 题意还是很好理解的,要在字符串haystack中查找一个完整的needle,即字符串匹配。 暴力求解就是用 两层循环 :haystack从第

    2024年02月09日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包