鱼C论坛

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

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

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

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

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

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


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


  1. #include "stdafx.h"
  2. # include <stdio.h>
  3. # include <tchar.h>
  4. # include <windows.h>

  5. extern "C"

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

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

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

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

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

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

  6. void InputOutput(char *Click, char *Keypress)
  7. {
  8.         if (Click != NULL)
  9.         {
  10.                 strcpy(TemporaryArray[TemporaryVariables], Click);
  11.                 TemporaryVariables++;
  12.         }

  13.         if (Keypress != NULL)
  14.         {
  15.                 strcpy(TemporaryArray[TemporaryVariables], Keypress);
  16.                 TemporaryVariables++;
  17.         }

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

  21. int main()
  22. {
  23.         InputOutput("Thank", "You");
  24.         InputOutput("789", "JQK");
  25.         InputOutput("QKA", "大小王");
  26.         int i;
  27.         for (i = 0; i < TemporaryVariables; i++)
  28.         {
  29.                 printf("%s\n", TemporaryArray[i]);
  30.         }

  31.         return 0;
  32. }
复制代码
回复

使用道具 举报

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

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

  6. void InputOutput(char *Click, char *Keypress)
  7. {
  8.         if (Click != NULL)
  9.         {
  10.                 strcpy(TemporaryArray[TemporaryVariables], Click);
  11.                 TemporaryVariables++;
  12.         }

  13.         if (Keypress != NULL)
  14.         {
  15.                 strcpy(TemporaryArray[TemporaryVariables], Keypress);
  16.                 TemporaryVariables++;
  17.         }

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

  21. int main()
  22. {
  23.         InputOutput("Thank", "You");
  24.         InputOutput("789", "JQK");
  25.         InputOutput("QKA", "大小王");
  26.         int i;
  27.         for (i = 0; i < TemporaryVariables; i++)
  28.         {
  29.                 printf("%s\n", TemporaryArray[i]);
  30.         }

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

使用道具 举报

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

回帖奖励 +1 鱼币

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


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

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

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

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

  13.     if (Keypress!=NULL)
  14.     {
  15.             strcpy(TemporaryArray[TemporaryVariables], Keypress);
  16.         TemporaryVariables++; //下标加一
  17.     }

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

  21. int main()
  22. {
  23.     MessageBox(NULL, InputOutput("91", "55"), NULL, MB_OK); //通过消息框的形式输出返回值
  24.     return 0;
  25. }
复制代码

评分

参与人数 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" ...



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



  1. # include <stdio.h>
  2. # include <windows.h>
  3. # include <string.h>

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

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

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

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

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

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

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

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

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

  34.         InputOutput("123", "456"); //此时调用完函数 应该是得到 TemporaryArray[0][0]="123", TemporaryArray[1][0]="456", TemporaryArray[2][0]="\0" 这样的返回值
  35.         InputOutput("789", "JQK"); //此时调用完函数 应该是得到 TemporaryArray[0][0]="123", TemporaryArray[1][0]="456", TemporaryArray[2][0]="789", TemporaryArray[3][0]="JQK", TemporaryArray[4][0]="\0" 这样的返回值
  36.         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" 这样的返回值
  37.        
  38.         // 每次调用结束都返回数据,因为不知道哪会就不在调用了,所以每次都返回;上边的这段是我构想的返回形式,方便理解,不一定能通过编译
  39.         */

  40.     return 0;
  41. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 03:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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