|
50鱼币
本帖最后由 aleiluya 于 2013-7-16 23:29 编辑
不用指针、全局变量和结构的情况下怎么实现从调用函数把数组返回主函数?
望高手解答~~~谢谢~~~
最好解释下为什么下面代码不可以,不胜感激~~~- /* return数组 */
- #include <stdio.h>
- char try(char s[]);
- void main()
- {
- char s[20];
- printf("is:%s", try(s));
- }
- char try(char s[])
- {
- s = "hello!";
- }
复制代码 正在学 C程序设计语言(K&R) :练习3-5之前没有指针、全局变量和结构。
以下是为什么我要知道怎么return数组:- /*
- 3-5:编写函数itob(n,s,b),将整数n转换为以b为低的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n,s,16)把整数n格式化成十六进制整数保存在s中。
- */
- #include <stdio.h>
- char hex(int n, char s[]);
- char itob(int n, char s[], int b);
- char binary(int n, char s[]);
- void main()
- {
- int n, b;
- static char s[50];
- printf("请安以下的格式输入:你想要转换的数 以什么形式(只限二进制和十六进制)\n");
- while (1)
- {
- scanf("%d %d", &n, &b);
- if ((b == 2) || (b == 16))
- {
- printf("%s\n", itob(n, s, b));
- }
- else
- {
- printf("输入的格式错误,请重新输入!\n");
- }
- }
- }
- /*如果是要二进制就调用二进制函数,如果是十六进制就调用十六进制。我记得数组传送是传送数组的首地址也就是物理地址,难道错了嘛?错了的话怎么正确实现。ps:难道要我把三个函数合成一个?*/
- char itob(int n, char s[], int b) //本问题的函数
- {
- switch (b)
- {
- case 2:
- printf("进入函数itob的switch(2)。\n");
- s = binary(n, s); //测试,也测试过printf("%s",binary(n,s));
- printf("%s", s);
- return s;
- break;
- case 16:
- printf("进入函数itob的switch(16)。\n"); //测试
- return (s = hex(n, s));
- break;
- }
- }
- /******************************************************/
- char binary(int n, char *s[]) //十进制转二进制
- {
- unsigned int i, temp; // 声明为无符号是因为不能是负数。
- temp = ~0; // 求得在任何机器上最大有多少位,并把结果保存在temp。
- for (i = 0; temp > 0; i++)
- {
- temp >>= 1; // 每循环右移一次就把次数保存在i。
- }
- i--; // 减去本身的次数。
- for (temp = 1; i > 0; i--) // 把最高位弄成1,其余0。
- {
- temp <<= 1;
- }
- i = 0;
- while (temp > 0) // 用位操作把n以二进制形式提取出来。
- {
- if ((n & temp) == 0)
- {
- s[i++] = '0';
- }
- else
- {
- s[i++] = '1';
- }
- temp >>= 1; // 每输出一次就右移一位,进行下一位输出准备。
- }
- s[i] = '\0';
- printf("进入函数binary,现返回s:%s\n", s);//测试
- return s;
- }
- // / /// /// /// /// /// /// /// /// /// /// /// ///
- char hex(int n, char s[]) //十进制转十六进制
- {
- unsigned int i, j, temp; // 声明为无符号是因为不能是负数。
- s[0] = '0';
- s[1] = 'X';
- temp = ~0; // 求得在任何机器上最大有多少位,并把结果保存在temp。
- for (i = 0; temp > 0; i++)
- {
- temp >>= 1; // 每循环右移一次就把次数保存在i。
- }
- i /= 4;
- i--;
- for (temp = 15; i > 0; i--) // 把最高4位弄成1,其余0。
- {
- temp <<= 4;
- }
- i = 2;
- while (temp) // 第一个循环把左边的空白位删除。
- {
- if (n & temp) // 判断是否是n变量的最高位。
- {
- while (temp) // 第二个循环取值。
- {
- j = n & temp;
- while (((j & 15) == 0) && j) // 如果j不是0就把数字右移到最右边。
- {
- j >>= 4;
- }
- if (j > 9) // 大于9以上的用字母保存。
- {
- s[i++] = (j - 10) + 'A';
- }
- else
- {
- s[i++] = j + '0';
- }
- temp >>= 4; // 每循环一次就右移为下次做准备。
- }
- }
- s[i++] = '0'; // 不是数值的最高位就补0。
- temp >>= 4; // 每循环一次就右移为下次做准备。
- }
- s[--i] = '\0'; // 字符串结束标志。--是为了覆盖掉循环的0。
- printf("进入函数hex,现返回。\n"); //测试
- return s;
- }
复制代码 |
最佳答案
查看完整内容
05.char try(char s[]);
这个函数返回char类型,char不是数组,也不是字符指针
printf("is:%s", try(s));
这里试图将char以%s的方式打印出来,所以有问题。
C语言中,数组很容易转换为指针。和基本类型做一个对比,同样作为函数的输入参数,基本类型是值传递,而数组则转换为指针后传递指针(称为引用传递),函数的返回也类似。如果非要以值传递的方式返回一个数组,可以考虑利用结构体。
|