本题要求编写函数,将输入字符串的前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
题解:
/*方法一:利用指针先把前三位后面的字符赋值到一个数组,在赋值前面三位,最后用字符串处理函数覆盖掉s*/
void Shift( char s[] )
{
char str [MAXS]; //定义数组的话,需要使用宏定义的常量,不能自己输入数字,不然会出错(除非数组足够大)
int i; //循环变量
char *p = s + 3; //定义指针变量,地址是数组s[3]的地址
int j = 0; //str数组的下标变量 ,初值为0
/*把前三位后的字符后的字符赋值给新数组*/
for (i = 3; i < strlen (s); i++, p++) //i到数组长度,或者也可以s [i] != '\0',
{
// 循环结束后指针变量p需要加一,让它指向下一位
str [j++] = *p;
}
/*把前三位字符赋值给新数组*/
p = s; //指针p等于s,获得s的首地址,也就是s[0]
for (i = 0; i < 3; i++, p++)
{
str [j++] = *p;
}
str [j] = '\0'; //循环结束后还要给新数组增加上字符串结束标识
strcpy(s,str); //把str素组赋值给s数组(s数组的东西被覆盖掉)
}
/*方法二:每轮第一位存到中间变量,然后所有位向前移动一位*/
//void Shift( char s[] )
//{
// int i, j; //循环变量
// char temp; //中间变量
//
// /* 流程图
// abcdef\0
// bcdef\0\0 -> bcdefa\0
// cdefa\0\0 -> cdefab\0
// defab\0\0 -> defabc\0
// */
//
///*连续三轮取第一个字符给中间变量temp然后后面一位放到前面一位,循环结束把temp放到最后一位减一位上,因为最后一位是\0*/
// for (i = 0; i < 3; i++) //循环前面三位数,准备往后移
// {
// temp = s [0]; //每一轮temp等于第一个字符
// for (j = 0; s [j] != '\0' ; j++) //内循环从头到尾(因为每位字符都要移动)
// {
// s [j] = s [j + 1]; //后面一位移到前面一位
// }
// s [j - 1] = temp; //把倒数第二位赋值位刚刚temp存的字符 (因为最后一位固定是\0)
// s [j] = '\0'; //此句不写也行 ,因为最后一位\0不会被改变,固定是\0
// }
//}
/*方法三:利用字符串处理函数*/
//void Shift( char s[] )
//{
// char a [MAXS], b [MAXS]; //定义数组的话,需要使用宏定义的常量,不能自己输入数字,不然会出错(除非数组足够大)
// strcpy (a, s); //把s数组的内容给a
// a [3] = '\0'; //a字符串中只有s字符串的前3个字符
// strcpy (b, s + 3); //b字符串中是s字符串中除了前3个字符剩下的字符(s + 3是从第三位开始)
// strcat (b, a); //合并成一个字符串
// strcpy (s,b); //复制(把b数组的内容给s)
//}