题目:在主函数中输入一个字符串(不包含空格),写一个新函数将字符串按反序存放,并在主函数中输出反序后的字符串
故事背景:
阿华家养了一只电子哈士奇小哈,为了防止它闲的拆家,阿华走之前给狗留了道作业,告诉它在自己回家之前做不出来,就三天不带他见隔壁养的那只小士,小哈一听不能去见软fufu的小士,立马认真起来。
小哈的苦恼——
看到阿华留下一串不认识的人类语言——123456abcdef,阿华说只要自己能够把这个字符串“倒背如流”就算完成了作业。
可是自己出厂时只安装了复读机功能,并不具备“倒背”技能啊!
小哈边给自己充电边运转电子脑,突然它冒出一个大胆的想法——我要自己给自己“安装”这个技能!
奋斗的小哈之只用main函数实现反序——
说干就干!
曾经被阿华拉着一起学了一门叫C语言的人类语言,虽然当初自己不情不愿的,没存储多少内容,不过连一下家里的WIFI用电子脑很快就能找到,小哈为自己的聪明才智小小得意了五分钟。
它照猫画虎将电子脑翻到,跟阿华练习C语言一样的界面,再用软键盘打出了
#include<stdio.h>
int main(void){
return 0;
}它又点了运行,发现并没有什么问题,小哈想我就记得阿华每次都先写这些,果然没记错~
小哈想到:接下来我应该把字符串,放到这个叫主函数的东西里面去,这么长一串那就存到数组里面吧,于是它又加了两句
#include<stdio.h>
int main(void){
char array[100];
gets(array);
return 0;
}我记得gets()能把字符串写入数组里,但是为了保险起见,我还是输出看看吧
#include<stdio.h>
int main(void){
char array[100];
gets(array);
printf("%s",array);
return 0;
}嗯,果然不出我所料,那么下一步我先要将它顺序反一下,这个简单嘛,我只需要再写一个新数组,把array数组的最后一个元素赋值给新数组的第一个元素,把array的倒数第二个赋值给新数组的第二个……
这样一个一个赋值,万一阿华明天换一个字符串,我又要重新写了,让我好好思考一下。
我想到了!我可以用for循环实现赋值——
先用strlen()函数计算出array的长度,array数组最后一个元素的下标就是长度-1;
然后把array数组的最后一个元素,赋值给新数组的第一个元素;
接着array数组的下标减一,新数组的下标加一,这样就把array的倒数第二个赋值给新数组的第二个啦……
让新数组的下标一直增加到,与array数组最后一个元素的下标相等,就可以把array中的所有元素赋值给新数组了啊!
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
int main(void){
char array[100],newarray[100];
gets(array);
//printf("%s",array);
int num = strlen(array); //先计算出array数组长度
int i,j=num-1; //数组下标是从0开始,所以最后一个元素的下标需要用长度-1
/*
当新数组newarray元素下标,增加到和array长度相等时
array中的所有元素都被反序存到newarray中了
就可以结束循环啦
*/
for(i=0;i<num;i++){
newarray[i] = array[j];
printf("%c",newarray[i]);
j--;
}
return 0;
}哇!我成功了,芜湖~
志得意满了十分钟后,小哈开始思考,如果说我把反序这个操作,写成一个单独的函数,那以后要是又要用到我就可以直接调用,不用再写一遍啦~思及此,小哈的雄心又被唤醒。
进击的小哈之用新函数反序,主函数输入输出——
废话不多说,先给我的新函数起个响亮的名字
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
int FlashBack(){
return 0;
}
int main(void){
char array[100],newarray[100];
gets(array);
//printf("%s",array);
int num = strlen(array); //先计算出array数组最后一个元素的下标
int i,j=num-1; //数组下标是从0开始,所以最后一个元素的下标需要用长度-1
for(i=0;i<num;i++){
newarray[i] = array[j];
printf("%c",newarray[i]);
j--;
}
return 0;
}嗯不错不错FlashBack听起来就很霸气!
既然我要用新函数来反序,那先要将main函数中array数组传输给FlashBack函数,而且main函数中的反序也就不需要了。
main函数里的array数组是char类型的,那我的新函数FlashBack的形参也要统一才行!
而且根据刚才实现的反序来看,会用到array数组的长度这个数据,所以我还需要将strlen(array)这个数据传递给FlashBack。
那么也就是说,我的新函数会拥有两个形参啦~一个是char型的数组,一个是int型的长度。
那就让我试试吧
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
int FlashBack(char a[],int n){
printf("%s\n%d",a,n);
return 0;
}
int main(void){
char array[100];
gets(array);
//printf("%s",array);
int num = strlen(array); //先计算出array数组长度
FlashBack(array,num);
return 0;
}看来需要的数据已经传递给新函数FlashBack了!
接下来我就像刚才在main函数中反序一样,用一个for循环在FlashBack函数中反序就好啦~
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
int FlashBack(char a[],int n){
//printf("%s\n%d",a,n);
char newarray[100];
int i,j=n-1;
for(i=0;i<n;i++){
newarray[i] = a[j];
printf("%c",newarray[i]);
j--;
}
return 0;
}
int main(void){
char array[100];
gets(array);
//printf("%s",array);
int num = strlen(array); //先计算出array数组长度
FlashBack(array,num);
return 0;
}哇呜~果然实现了!不过我是一只心思缜密的修勾,在函数里写死输出格式,这可不行!
我要在main函数中输出,这样以后就算是要修改输出格式,也不用去动我的FlashBack函数啦~
可是数组是不可以作为返回值被return的,那我要怎么将反序后的数组传递给main函数呢?
对了,可以用指针呀!
我在FlashBack函数中声明一个指针,让指针指向newarray数组的首地址;
然后return这个指针给main函数;
newarray数组是个char型数组,那么我需要一个char型的指针;
这样的话main函数也需要声明一个char型的指针,用来接收FlashBack函数中的指针类型的返回值。
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
char* FlashBack(char a[],int n){
char newarray[100];
int i,j=n-1;
char* b;
for(i=0;i<n;i++){
newarray[i] = a[j];
j--;
}
b = &newarray[0];
return b;
}
int main(void){
char array[100];
char* b;
int i;
gets(array);
int num = strlen(array); //先计算出array数组长度
b = FlashBack(array,num);
for(i=0;i<num;i++)
printf("%c",b[i]);
return 0;
}咦?为什么只输出了反序数组newarray中的第一个元素,让我好好检查一下!
啊!我知道了!
newarray数组是在函数FlashBack中定义的,当函数执行完之后,数组被分配的空间会释放,所以main函数中才会出现输出不全的现象。
那我就将newarray数组定义成局部静态变量,这样函数执行完也不会释放空间啦~
#include<stdio.h>
#include<string.h> //strlen()函数在string头文件中,一定得先调用一下
char* FlashBack(char a[],int n){
static char newarray[100];
int i,j=n-1;
char* b;
for(i=0;i<n;i++){
newarray[i] = a[j];
j--;
}
b = &newarray[0];
return b;
}
int main(void){
char array[100];
char* b;
int i;
gets(array);
int num = strlen(array); //先计算出array数组长度
b = FlashBack(array,num);
for(i=0;i<num;i++)
printf("%c",b[i]);
return 0;
}终——终于让我实现啦!!!
沉思的小哈——
突然感觉拆家也没有很好玩,感觉在dotcpp上做作业比拆家有意思多了~
而且还能增加学识,这样小士一定会更迷恋我的,她就会分我吃她的小鱼干了~
隔壁橘猫小士:我不是真的人,但你是真的狗!
0.0分
131 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include <stdio.h> #include <math.h> #include <string.h> int main(){ char str[100]; gets(str); int len = strlen(str); for(int i=len-1;i>=0;i--){ printf("%c",str[i]); } return 0; }#include<stdio.h> #include<string.h> int main() { char a[100]; gets(a); int n = strlen(a); int i ; for(i=n-1;i>=0;i--){ printf("%c",a[i]); } return 0; }#include<stdio.h> #include<string.h> void reverse(char arr[]) { int len = strlen(arr); int left = 0; int right = len - 1; while (left < right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } int main() { char arr[1000] = { 0 }; scanf("%s", arr); reverse(arr); printf("%s\n", arr); return 0; }#include<stdio.h>//用栈来模拟这个过程简直太棒了 void Print() { char a=getchar(); if(a!='\n') Print(); printf("%c",a); } int main() { Print(); return 0; }这个平台的格式错误应该怎么解决啊#include<stdio.h> #include<string.h> int main() { char x[100]; int t,i; printf("写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)。\n"); scanf("%s",&x); t=strlen(x); for(i=t-1;i>=0;i--) { printf("%c",x[i]); } printf("\n"); return 0; }#include <stdio.h> #include <string.h> int main() { char a[20]; int n,i; scanf("%s",a); n=strlen(a); for(i=n-1;i>=0;i--) { printf("%c",a[i]); } return 0; }#include <stdio.h> #include<string.h> void char_reverse(char *p, int m); void main(void) { char a[100]; scanf( "%s" , &a[0] ); char_reverse( &a[0], strlen(a)); } void char_reverse(char *p, int m) { int i; for(i=m; i>0; i--) { printf("%c",*(p+i-1)); } }