鱼C论坛

 找回密码
 立即注册
查看: 2238|回复: 5

[已解决]如何将函数的参数保存起来,并通过数组或指针的形式返回保存的数据

[复制链接]
匿名鱼油
匿名鱼油  发表于 2017-7-22 16:37:46 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 匿名 于 2017-7-25 12:53 编辑


我写了个函数,功能是传入参数(字符串)并保存,然后通过返回值的形式把保存的数据(字符串)返回
结果只能返回一个字符,无法返回字符串,请高手帮忙看一下
#include "stdafx.h"
# include <stdio.h>
# include <tchar.h>
# include <windows.h>

extern "C"

int TemporaryVariables=0; 用来索引下标的临时变量
char TemporaryArray[2][3]; //用来存放参数(字符串)的数组

char *InputOutput(char *Click, char *Keypress); //函数声明
char *InputOutput(char *Click, char *Keypress) //函数的定义
{
        if (Click!=NULL) //判断参数是否为空
        {
                TemporaryArray[TemporaryVariables][0] = *Click; //把参数传给数组
                TemporaryVariables++; //下标加一
        }

        if (Keypress!=NULL)
        {
                TemporaryArray[TemporaryVariables][0] = *Keypress; //把参数传给数组
                TemporaryVariables++; //下标加一
        }

        return *TemporaryArray; //返回保存的数据
}

int main()
{
        MessageBox(NULL, InputOutput("91", "55"), NULL, MB_OK); //通过消息框的形式输出返回值
        return 0;
}
最佳答案
2017-7-25 11:19:50
# include <stdio.h>
# include <windows.h>
# include <string.h>

int TemporaryVariables = 0;
char TemporaryArray[100][100];                        //这里为了防止溢出,定义的比较大

void InputOutput(char *Click, char *Keypress) 
{
        if (Click != NULL)
        {
                strcpy(TemporaryArray[TemporaryVariables], Click);
                TemporaryVariables++;
        }

        if (Keypress != NULL)
        {
                strcpy(TemporaryArray[TemporaryVariables], Keypress);
                TemporaryVariables++;
        }

        //结束标志\0在这个程序中没用,TemporaryVariables就可以用来表示到哪里结束了
        //后面return删了,因为TemporaryArray是全局变量不需要返回
}

int main()
{
        InputOutput("Thank", "You"); 
        InputOutput("789", "JQK");
        InputOutput("QKA", "大小王");
        int i;
        for (i = 0; i < TemporaryVariables; i++)
        {
                printf("%s\n", TemporaryArray[i]);
        }

        return 0;
}
回复

使用道具 举报

发表于 2017-7-25 11:19:50 | 显示全部楼层    本楼为最佳答案   
# include <stdio.h>
# include <windows.h>
# include <string.h>

int TemporaryVariables = 0;
char TemporaryArray[100][100];                        //这里为了防止溢出,定义的比较大

void InputOutput(char *Click, char *Keypress) 
{
        if (Click != NULL)
        {
                strcpy(TemporaryArray[TemporaryVariables], Click);
                TemporaryVariables++;
        }

        if (Keypress != NULL)
        {
                strcpy(TemporaryArray[TemporaryVariables], Keypress);
                TemporaryVariables++;
        }

        //结束标志\0在这个程序中没用,TemporaryVariables就可以用来表示到哪里结束了
        //后面return删了,因为TemporaryArray是全局变量不需要返回
}

int main()
{
        InputOutput("Thank", "You"); 
        InputOutput("789", "JQK");
        InputOutput("QKA", "大小王");
        int i;
        for (i = 0; i < TemporaryVariables; i++)
        {
                printf("%s\n", TemporaryArray[i]);
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-24 18:44:55 | 显示全部楼层

回帖奖励 +1 鱼币

下面这两句你仔细看一下,TemporaryArray[TemporaryVariables][0]这个是char类型的,你却将*Click(字符串)赋值给它,当然会出问题啊,只会复制第一个字符过去
char TemporaryArray[2][3];
TemporaryArray[TemporaryVariables][0] = *Click;

后面return *TemporaryArray, 这个*TemporaryArray等同于TemporaryArray[0],但由于第一个问题,这里面只有TemporaryArray[0][0]存了一个字符9,所以最终返回的只有'9'

下面是改过的,你的题目意思是把两个字符串合成一个输出到提示框中吧,所以后面用了strcat()函数,合并两个字符串
# include <stdio.h>
# include <windows.h>
# include <string.h>

int TemporaryVariables=0; 
char TemporaryArray[2][20]; //用来存放参数(字符串)的数组

char *InputOutput(char *Click, char *Keypress) //函数的定义
{
    if (Click!=NULL) //判断参数是否为空
    {
            strcpy(TemporaryArray[TemporaryVariables], Click);
        TemporaryVariables++; //下标加一
    }

    if (Keypress!=NULL)
    {
            strcpy(TemporaryArray[TemporaryVariables], Keypress);
        TemporaryVariables++; //下标加一
    }

        strcat(TemporaryArray[0], TemporaryArray[1]);
    return TemporaryArray[0]; //返回保存的数据
}

int main()
{
    MessageBox(NULL, InputOutput("91", "55"), NULL, MB_OK); //通过消息框的形式输出返回值
    return 0;
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
806432426 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2017-7-24 21:07:41
shuofxz 发表于 2017-7-24 18:44
下面这两句你仔细看一下,TemporaryArray[TemporaryVariables][0]这个是char类型的,你却将*Click(字符串 ...

你理解错了,我的意思是用一个函数接受字符串,每次调用函数都保存传递进来的字符串,保存完返回保存的字符串
我发的代码只是我的构想,连编译都通不过,如果可以请帮忙写一份代码
我不是伸手党,这个问题我研究好几天了,没什么头绪,只希望你能帮助我
回复 支持 反对

使用道具 举报

发表于 2017-7-24 22:07:19 | 显示全部楼层
匿名者 发表于 2017-7-24 21:07
你理解错了,我的意思是用一个函数接受字符串,每次调用函数都保存传递进来的字符串,保存完返回保存的字符 ...


我还是没太懂
你写的这个函数为什么有两个参数呢?两个参数都是做什么用的?
InputOutput("91", "55")

返回值应该是什么呢?
就比如你写的输入91 55, 返回值还是91 55么?

还有“保存”是干什么用的呢?
是后面再调用这个函数的时候,把之前的值也一起返回么?
InputOutput("91", "55")
InputOutput("11", "22")
InputOutput("33", "44")
就比如连续执行这三行代码后,每次都应该返回什么呢?

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
806432426 + 5 + 5 + 2 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2017-7-25 10:05:49
本帖最后由 匿名 于 2017-7-25 10:13 编辑
shuofxz 发表于 2017-7-24 22:07
我还是没太懂
你写的这个函数为什么有两个参数呢?两个参数都是做什么用的?
InputOutput("91", "55" ...



感谢,我又把代码重新标注了一遍,并且加入了点别的代码,好让你理解我的想法(代码可能无法通过编译,只作为理解使用),代码如下

# include <stdio.h>
# include <windows.h>
# include <string.h>

static int TemporaryVariables=0; //用来存放下标
static char TemporaryArray[2][20]={'0'}; //用来存放参数(字符串)的数组,这里应该是这样的下标 [无限大] [0] 好为多次调用做准备; 顺便初始化数组元素,防止数组中出现其他数据

//由于数组和和变量均在函数外,理论上来说都是全局形式的,不会因为函数返回而被释放,为了能更直观的表达我的意思,在全局数组和变量前都加上"static" 声明为静态局部变量,用于扩充作用域

char *InputOutput(char *Click, char *Keypress) //函数的定义
{
    if (Click!=NULL) //判断参数(Click)是否为空,如果不为空,就把数据存到二维数组里
    {
            strcpy(TemporaryArray[TemporaryVariables] [0], Click); //这个就是二维数组,下标为:[TemporaryVariables] [0] 的二维数组
        TemporaryVariables++; //下标加一
    }

    if (Keypress!=NULL) //判断参数(Click)是否为空,如果不为空,就把数据存到二维数组里
    {
            strcpy(TemporaryArray[TemporaryVariables] [0], Keypress); //这个就是二维数组,下标为:[TemporaryVariables] [0] 的二维数组
        TemporaryVariables++; //下标加一
    }

        // TemporaryVariables 是用来存放和下标的,不做索引使用,只是为了让参数依次存放到数组中

        //strcat(TemporaryArray[0], TemporaryArray[1]); //这里不要连接两个字符,容易混淆

        /*
        // TemporaryArray[TemporaryVariables+1][0]={'\0', '\0', '\0', '\0', '\0', '\0', }; //这段的目的是用来标志数组的结束,方便主调用函数的判断,每次传递进来新数据都会覆盖这一段,如果不向这段写入数据,则将这段定义为结束标志
        */

    return TemporaryArray[0][0]; //返回数组中保存的数据
}

int main()
{
    //MessageBox(NULL, InputOutput("91", "55"), NULL, MB_OK); //这里先不通过通过消息框的形式输出返回值,容易混淆
        
        InputOutput('Thank', "You") // 这里只是象征性的调用一下,我的想法在下边↓↓↓↓↓↓↓↓↓
        
        /*
        //返回值不一定是数组首地址的形式,也可以返回指针,通过检测是否为'\0'来判断是否结束,这整段代码用的是返回数组首地址的形式传递字符串参数

        InputOutput("123", "456"); //此时调用完函数 应该是得到 TemporaryArray[0][0]="123", TemporaryArray[1][0]="456", TemporaryArray[2][0]="\0" 这样的返回值
        InputOutput("789", "JQK"); //此时调用完函数 应该是得到 TemporaryArray[0][0]="123", TemporaryArray[1][0]="456", TemporaryArray[2][0]="789", TemporaryArray[3][0]="JQK", TemporaryArray[4][0]="\0" 这样的返回值
        InputOutput("QKA", "大小王"); //此时调用完函数 应该是得到 TemporaryArray[0][0]="123", TemporaryArray[1][0]="456", TemporaryArray[2][0]="789", TemporaryArray[3][0]="JQK", TemporaryArray[4][0]="QKA", TemporaryArray[5][0]="大小王", TemporaryArray[6][0]="\0" 这样的返回值
        
        // 每次调用结束都返回数据,因为不知道哪会就不在调用了,所以每次都返回;上边的这段是我构想的返回形式,方便理解,不一定能通过编译
        */

    return 0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表