一题双解----刷题从简单做起【每天学习一个小知识】

实在没什么短时间可以写的长文的了(毕竟我每天还要

上课,长文有点难肝啊

我的口号是:质量不够,水题来凑!!!哒咩>_<

这篇文章试水之做,就当是笔记了,觉水勿喷



那也就不多整了,直接上题

移动字母

本题要求编写函数,将输入字符串的前3个字符移到最后。

函数接口定义:

void Shift( char s[] );

其中char s[]是用户传入的字符串,题目保证其长度不小于3;函数Shift须将按照要求变换后的字符串仍然存在s[]里。

裁判测试程序样例:

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

#define MAXS 10

void Shift( char s[] );

void GetString( char s[] ); /* 实现细节在此不表 */

int main()
{
    char s[MAXS];

    GetString(s);
    Shift(s);
    printf("%s\n", s);
    
    return 0; 
}

/* 你的代码将被嵌在这里 */

输入样例:

abcdef

输出样例:

defabc

是不是很简单啊!(确实太简单了,要不是有这个活动,我才不想水呢)

解法一:

思路:像队列一样,前头出去一个,后头的向前补齐,设置一个临时变量来储存前头出去的那个

之后放在最后,循环三次可解

代码实现:

void Shift(char s[]) {
	char temp = '\0';  //临时储存变量
	int len = 0;       //长度
	for (int i = 0; i < MAXS; i++, len++)//得到长度
		if (s[i] == '\0')  
			break;
	for (int i = 0; i < 3; i++) {
		temp = s[0];
		for (int j = 0; j < len - 1; j++)//该循环用来补齐前面
			s[j] = s[j + 1];
		s[len - 1] = temp;   //补齐后面
	}
}

解法二:

思路:其实也没什么思路,只是我看到有个<string.h>,我觉得还可可以用一下头文件里的函数,毕竟都带了,难到浪费吗?

用strncpy函数拷贝字符串前三个字符,其他字符向前对齐,再用strcat将那三个字符与改变后的字符串连接起来

代码实现:

void Shift(char s[]) {
	char temp[4] = "";  //虽然说只用复制进三个字符,但四个才不会出错,等会讲
	strncpy(temp, s, 3);
	for (int i = 3, j = 0; i < MAXS; i++, j++)//向前进
		s[j] = s[i];
	strcat(s, temp);   //拼接两个字符串
}

浅谈<string.h>

就按上面出现过的库函数来展开

strncpy 字符串拷贝(带拷贝数量参数)

函数原型 :

char * strncpy ( char * destination, const char * source, size_t num );

destination 为要拷贝到的字符串

source         为被拷贝的字符串

num             指选择被拷贝的字符串的前多少个字符

同时还有一个不带拷贝数量的函数

strcpy 字符串拷贝

函数原型:

char * strcpy ( char * destination, const char * source );

destination 为要拷贝到的字符串

source         为被拷贝的字符串

注意:虽然无拷贝数量,但是以字符串的结束标志'\0'为止,并且拷贝包括'\0'若无'\0'会出错

​
char str[5]={'a','b','c','d','e'};
char str2[5]={0};
strcpy(str2,str);

………………………………………………………………………………………………
编译结果:
 Stack around the variable 'str' was corrupted.

​

还有一个字符串拼接函数

strcat  字符串拼接

函数原型:

char * strcat ( char * destination, const char * source );

destination 为要拼接到的字符串

source 为被用去拼接的字符串(该字符串必须为可读字符串)

注意:destination被拼接的位置从'\0'开始,并掩盖'\0'

还有带拼接数量的

strncat 字符串拼接(带拼接数量参数)

函数原型:

char * strncat ( char * destination, const char * source, size_t num );

destination 为要拼接到的字符串

source 为被用去拼接的字符串(该字符串必须为可读字符串)

num  指选择被用去拼接的字符串的前多少个字符

注意:destination被拼接的位置从'\0'开始,并掩盖'\0',若选取用去拼接的字符串无'\0',则在末尾加上'\0'

 另外还有几个函数,我就不一一解释它们形参的意思了

strlen 求字符串长度

函数原型:

size_t strlen ( const char * str );

注意:它的返回类型为size_t,其实是unsigned int,如果你的编译器不支持%zd打印,就用%u打印

strcmp 比较字符串 

函数原型:

int strcmp ( const char * str1, const char * str2 );

规则:先从两个字符串的第一个字符开始比较

strcmp函数返回值规则

返回值 表示 <0 str1的字符值小于str2的字符值 =0 str1的字符值等于str2的字符值 >0 str1的字符值大于str2的字符值

若字符相比等于零直接向后一位字符比较,直到遇到不同的字符或同时遇到'\0'

遇到不同的字符直接返回一个值,若判断两个字符相等,返回 0

 strncmp 比较字符(含比较数量)

函数原型:

int strncmp ( const char * str1, const char * str2, size_t num );

strcmp类似,只是判断前面限定长度字符串,直到遇到不同或直到限定长度末尾停

 strstr 查找字符串

函数原型:

char * strstr (  char * str1, const char * str2 );

若str2是str1的子串,即str2包含在str1里,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL

strtok 切割字符串

函数原型:

char * strtok ( char * str, const char * delimiters );

str 为将要被切割的字符串

delimiters 为包含要被去掉的分割字符(任何字符都行)

函数扫描字符串,直到分隔符,用'\0'替换掉它,并且返回分割下来的字符串的第一个字符的地址。但是这只切割了一次,如果想再次切割这个字符串,可以在char * str形参输入NULL,表示函数记住前一次被切割出去的字符串的后面字符串第一个字符的地址,并且开始扫描,直到遇到分隔符或'\0'结束

示例代码:

#include <stdio.h>
#include <string.h>
int main() {
	char  str[] = "s-das-das-d";
		char* p;
		for (p = strtok(str, "a-"); p != NULL; p = strtok(NULL, "a-"))//以'a''-'为分隔符
			printf("%s\n", p);
	return 0;
}

****************************************
输出:
s
d
s
d
s
d

其他函数就先不讲了,这些函数其实就够用了。如果想继续学习其他库函数,可以用下面的网站去学习

  www.cplusplus.com 

作于2022/3/8  21:41

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值