练习8-8 移动字母 (10 分)

本题要求编写函数,将输入字符串的前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)
//}

猜你喜欢

转载自blog.csdn.net/qq_44715943/article/details/114654756
今日推荐