这也是笔试中一道经典的C语言题:
给定一个字符串,将其翻转。如abc ==> cba
拿到此题时,我是想都没想,直接说,再用一个字符串tmp来缓存一下此串,然后一个for循环赋值搞定。
思路有了,代码就有了。
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- char string[20],tmp[20];
- int length;
- printf("please input less than 20 char:");
- scanf("%s",string);
- printf("your input string is %s\n",string);
- length = strlen(string);
- printf("length is %d\n",length);
- for(int i = 0;i<length;++i)
- {
- tmp[i] = string[i];
- }
- for(int i = 0;i<length;++i)
- {
- string[i] = tmp[length-i-1];
- }
- printf("after revert:%s\n",string);
- return 0;
- }
#include <stdio.h>
#include <stdlib.h>
int main()
{
char string[20],tmp[20];
int length;
printf("please input less than 20 char:");
scanf("%s",string);
printf("your input string is %s\n",string);
length = strlen(string);
printf("length is %d\n",length);
for(int i = 0;i<length;++i)
{
tmp[i] = string[i];
}
for(int i = 0;i<length;++i)
{
string[i] = tmp[length-i-1];
}
printf("after revert:%s\n",string);
return 0;
}
用gcc编译:gcc -o revert revert_string.c -std=c99
后运行,结果如我所料。但是我这个算法太不优雅了,因为将两个字符数组赋值就用了一个循环,然后翻转时再用一个循环,这效率真是不敢恭维。
优雅的方法应该是这样的思路:
找到这个字符串的中间位置,然后将其左边的字符与右边的字符交换位置。
实现起来应该是下面这样:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- char string[20], tmp;
- int length;
- printf("please input less than 20 char:");
- scanf("%s",string);
- printf("your input string is %s\n",string);
- //get string length,very useful method
- for(length=0;string[length];length++)
- ;
- printf("length is %d\n",length);
- //very beateful !!!
- for(int i=0;i<length/2;i++)
- {
- tmp = string[i];
- printf("tmp is %c\n" ,string[i]);
- string[i] = string[length-i-1];
- printf("string[%d] is %c\n",i,string[length-i-1]);
- string[length-i-1] = tmp;
- printf("string[%d] is %c\n",length-i-1,tmp);
- }
- printf("after revert:%s\n",string);
- return 0;
- }
#include <stdio.h>
#include <stdlib.h>
int main()
{
char string[20], tmp;
int length;
printf("please input less than 20 char:");
scanf("%s",string);
printf("your input string is %s\n",string);
//get string length,very useful method
for(length=0;string[length];length++)
;
printf("length is %d\n",length);
//very beateful !!!
for(int i=0;i<length/2;i++)
{
tmp = string[i];
printf("tmp is %c\n" ,string[i]);
string[i] = string[length-i-1];
printf("string[%d] is %c\n",i,string[length-i-1]);
string[length-i-1] = tmp;
printf("string[%d] is %c\n",length-i-1,tmp);
}
printf("after revert:%s\n",string);
return 0;
}
运行效果如下:
- D:\workspace\C\revert_string>gcc -o revert revert_string.c -std=c99
- D:\workspace\C\revert_string>revert
- please input less than 20 char:abc
- your input string is abc
- length is 3
- tmp is a
- string[0] is c
- string[2] is a
- after revert:cba
- D:\workspace\C\revert_string>revert
- please input less than 20 char:abcd
- your input string is abcd
- length is 4
- tmp is a
- string[0] is d
- string[3] is a
- tmp is b
- string[1] is c
- string[2] is b
- after revert:dcba
D:\workspace\C\revert_string>gcc -o revert revert_string.c -std=c99
D:\workspace\C\revert_string>revert
please input less than 20 char:abc
your input string is abc
length is 3
tmp is a
string[0] is c
string[2] is a
after revert:cba
D:\workspace\C\revert_string>revert
please input less than 20 char:abcd
your input string is abcd
length is 4
tmp is a
string[0] is d
string[3] is a
tmp is b
string[1] is c
string[2] is b
after revert:dcba
这样的算法,相比之前要提高甚多效率。只要开动脑筋,世界会更加优雅。
题目如下: 写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。
方法1(自己写的) #include<stdio.h>
点击(此处)折叠或打开
- #include<stdlib.h>
- char* reserve(char* str);
- int get_length(char
*str); - int main(void)
- {
- char *str="I am a student";
- str="you are a student";
- char *result=reserve(str);
- printf("%s\n",result);
- free(result);
- result=NULL;
- str=NULL;
- return 0;
- }
- int get_length(char
*str) - {
- int length=-1;
- if(str!=NULL)
- {
- length=0;
- while(*str++!='\0')
- {
- length++;
- }
- }
- return length;
- }
- char* reserve(char* str)
- {
- int i=get_length(str);
- printf("%d\n",i);
- char* result=malloc(sizeof(char)*(i+1));
- if(result==NULL)
- {
- printf("%s\n","allocate string failed");
- exit(1);
- }
- char* temp=malloc(sizeof(char)*i);
- if(temp==NULL)
- {
- printf("%s\n","allocate string failed");
- exit(2);
- }
- char c='\0';
- int n=i-1;
- int m=0;
- c=*str;
- while(c!='\0')
- {
- if(
') - {
- temp[m++]=c;
- }
- else
- {
- for(m=m-1;m>=0;m--)
- {
- result[n--]=temp[m];
- }
- result[n--]=c;
- m=0;
- }
- str++;
- c=*str;
- }
- for(m=m-1;m>=0;m--)
- {
- result[n--]=temp[m];
- }
- free(temp);
- temp=NULL;
- return result;
- }
方法2(从网上收集过来的)
点击(此处)折叠或打开
- #include
<stdio.h> - void main()
- {
- char str[]="you are a student";
- printf(str);
- printf("\n");
- char *p,*q;
- char temp;
- p=q=str;
- while(*q!='\0')
- {
- q++;
- }
- q--;
- while(p<=q)
- {
- temp=*p;
- *p=*q;
- *q=temp;
- p++;
- q--;
- }//反转整个字符串
- printf(str);
- printf("\n");
- char *s;
- q=p=s=str;//指针指向开始位置
- while(*q!='\0')
- {
- if(*q=='
'||*(q+1)=='\0') - {
- p--;
- if(*(q+1)=='\0')//处理最后一个字串
- p++;
- while(s<=p)
- {
- temp=*p;
- *p=*s;
- *s=temp;
- s++;
- p--;
- }//反转局部字符串
- s=q+1;
- p=q;
- }
- q++;
- p++;
- }
- printf(str);
- printf("\n");
- }
方法3(传说中是《程序员面试宝典》里的方法,不过我没有看过这本书,也没去验证): #include <iostram>
点击(此处)折叠或打开
- #include
<stdio.h> - int main(void)
- {
- int num=-12345,j=0,i=0,flag=0,begin,end;
- char str[]="I am a student",temp;
- j=strlen(str)-1;
- printf(" string=%s\n",str);
- //第一步是进行全盘反转,将单词变成“tneduts a ma I”
- while(j>i)
- {
- temp=str[i];
- str[i]=str[j];
- str[j]=temp;
- j--;
- i++;
- }
- printf(" string=%s\n",str);
- int i=0;
- //第二步进行部分反转,如果不是空格则开始反转单词
- while(str[i])
- {
- if(str[i]!='
') - {
- begin=i;
- while(str[i]&&str[i]!='
') - {
- i++;
- }
- i=i-1;
- end=i;
- }
- while(end>begin)
- {
- temp=str[begin];
- str[begin]=str[end];
- str[end]=temp;
- end--;
- begin++;
- }
- i++;
- }
- printf(" string=%s\n",str);
- return 0;
- }