菜蛙


私信TA

用户名:hu2022

访问量:1327

签 名:

明日复明日,明日何其多。我生待明日,万事成蹉跎。

等  级
排  名 1508
经  验 2232
参赛次数 0
文章发表 75
年  龄 0
在职情况 学生
学  校 哈工程
专  业

  自我简介:

题目:在主函数中输入一个字符串(不包含空格),写一个新函数将字符串按反序存放,并在主函数中输出反序后的字符串

故事背景:

阿华家养了一只电子哈士奇小哈,为了防止它闲的拆家,阿华走之前给狗留了道作业,告诉它在自己回家之前做不出来,就三天不带他见隔壁养的那只小士,小哈一听不能去见软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分

9 人评分

  评论区

//减少空间,不用创建新的数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fcn(char *arr)
{
    int n =strlen(arr);//strlen函数可计算给定字符串的长度,不包括'\0'在内
    int left =0;
    int right = n-1;
    while(left<=right)
    {
        int temp= arr[right];
        arr[right]=arr[left];
        arr[left]=temp;
        left++;
        right--;
    }
}
int main(void)
{
    char arr[128]={0};//注意这是char 类型    
    gets(arr);//gets以回车结束读取,也可用for循环代替,顺便计数,得到字符串长度,不用使用strlen函数
    fcn(arr);
    puts(arr);//printf("%s",arr);//也可用for循环输出
    //  return 0;
    system("pause");
}
2022-09-05 10:15:59 | |
  • «
  • 1
  • »