第3关:字符串反序输出
100
- 任务要求
- 参考答案
- 评论190
任务描述
写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
本关知识
数组作为函数参数
数组可以作为函数的参数使用,进行数据传送。
数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
数组名作为函数参数
用数组名作函数参数与用数组元素作实参有几点不同。
-
用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。
-
在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。 在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
字符串函数的使用
在使用字符串函数前应使用以下命令包含头文件 #include <string.h>
用求字符串长度的函数strlen求字符串的长度,如 int j = strlen(str); //str是一个字符数组
编程要求
本关的编程任务是补全ReverseOutput.c
文件中main函数,以实现字符串反序输出的功能。 实际的测试样例参见下文。 本关涉及的代码文件ReverseOutput.c
的代码框架如下:
//包含标准输入输出函数
#include<stdio.h>
//字符串处理函数
#include<string.h>
//基本框架如下,请在此添加‘反序输出’的代码
/********** 修改以下代码 **********/
...
int main(){
scanf(...);
reverseOutput(...);
...
return 0;
}
//函数主体
char reverseOutput(...){
...
}
/* or
int reverseOutput(...){
...
}
or else
...
*/
/********** 修改代码区间 **********/
其中: #include <stdio.h>
的意思是包含stdio
函数库,使得当前程序可以调用标准输入输出函数库中的函数。
测试说明
本关的测试过程如下:
- 平台编译
ReverseOutput.c
,然后链接相关程序库并生成ReverseOutput.exe
; - 平台运行
ReverseOutput.exe
,并以标准方式提供测试输入; - 平台获取
ReverseOutput.exe
的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对ReverseOutput.c
的测试样例:
测试输入: 123456789
预期输出: 987654321
测试输入: zhousiheng
预期输出: gnehisuohz
开始你的任务吧,祝你成功!
//包含标准输入输出函数
#include<stdio.h>
//字符串处理函数
#include<string.h>
//基本框架如下,请在此添加‘反序输出’的代码
/********** 修改以下代码 **********/
void reverseOutput(char str[]);
int main(){
char str[100];
scanf("%s",str);
reverseOutput(str);
printf("%s",str);
return 0;
}
void reverseOutput(char str[]){
int len = strlen(str);
for(int i = 0;i < len / 2;i++){
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
/* or
int reverseOutput(...){
...
}
or else
...
*/
/********** 修改代码区间 **********/