引子:今年暑假7月份的时候,打算找个实习单位锻炼一下能力,学点儿东西,投了创发科技的实习生,让我去面试,结果当场出一道字符串右移的题目让我坐他旁边编程,我直接懵逼了。考官后来看我实在做不出来,就问我的思路,我也是糊里糊涂说了一些,但一讨论总是存在各种问题,最后也不了了之没有再问了。现在复习完了C语言的第11章,回头再重新做一下。(最终的结果是没有应聘成功,但我想主要原因是我的实习时间太短了,只有2个月,而他要求半年,当然题目没做出来也是一个重要原因吧)
题目:编写一个函数,要求输入一个字符串和要移动的位数n,使得该字符串能向右移动n位,输出移动后的字符串。例如:tomloveslily移动2位得lytomlovesli。
思路:意思就是把字符串分成两部分,交换位置,实际操作的思路是:把最后n个字符先保存起来(待会儿用),再把前strlen-n个字符往后移动n个,最后把之前保存的后n个字符放在前n个字符的位置上。注意两个问题:交换部分时需要借助第三者来暂时存储(类似于交换x,y的值需要借助第三变量);移动字符串时要从右往左挨个赋值,不能从左往右赋值(否则的话相当于改变了字符再移动)。
代码如下:
void right_move(char * str, int n) //字符串str右移n个位置的函数 { int i; char * temp = (char *)malloc(n * sizeof(char)); //临时分配一块儿内存,大小根据要移动的位数决定 int len = strlen(str); for(i=0; i<n; i++) //给temp[]赋值为str[]的后n位 temp[i] = str[len-n+i]; for(i=0; i<len-n; i++) //把字符串的前len-n位右移n位 str[len-i-1] = str[len-i-1-n]; //每个字符右移n位 for(i=0; i<n; i++) //字符串前n位赋值(即原来的后n位) str[i] = temp[i]; }
总的代码如下:
/* 输入一个字符串,输入需要移动的位数,将字符串向右移动相应的位数 */ /* 例如:tomloveslily移动两位得lytomlovesli */ #include <stdio.h> #include <stdlib.h> #include <string.h> void right_move(char *, int); int main(void) { int n; char str[30]; puts("Please enter a line of string(less than 30 chars and \"enter\" to stop):"); gets(str); puts("enter the digits \"n\" you want to move:"); scanf("%d", &n); puts(str); right_move(str, n); puts(str); } void right_move(char * str, int n) { int i; char * temp = (char *)malloc(n * sizeof(char)); int len = strlen(str); for(i=0; i<n; i++) //给temp[]赋值为str[]的后n位 temp[i] = str[len-n+i]; for(i=0; i<len-n; i++) //把字符串的前len-n位右移n位 str[len-i-1] = str[len-i-1-n]; //字符右移n位 for(i=0; i<n; i++) //字符串前n位赋值(即原来的后n位) str[i] = temp[i]; }
总结:字符串这一章的题目还是挺有意思的,花了很多时间来对待是值得的,涉及到一些算法或者“办法”(排序、压缩、移动、交换等),挺考验人的思路的。同时这一章的内容也是面试或者笔试的常见考察内容。