教程集 www.jiaochengji.com
教程集 >  脚本编程  >  C语言  >  正文 C语言返回数组的学习笔记

C语言返回数组的学习笔记

发布时间:2018-10-01   编辑:jiaochengji.com
教程集为您提供C语言返回数组的学习笔记等资源,欢迎您收藏本站,我们将为您提供最新的C语言返回数组的学习笔记资源
其实早前的文章已经说过函数和数组和指针了,那么现在再来说一下归根结底还是又忘了的缘故,加上再给原来的多些扩展和补充,尽量达成互补的效果

问题来源于今天三班一个学霸问我,他的程序没法运行,什么情况?

那来看看他写的程序,虽然看着有些不舒服。

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy4985')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy4985>#include <stdio.h>
#include <string.h>
int main()
{
 char tra(char str[]);
 char b[80];
 gets(b);
 puts(tra(b));
return 0;
}
char tra(char str[])
{
 char stri[80];
int i,j,k=0;
i=strlen(str);
for(j=0;j<=2*i-1;j=j 2)
 {
 stri[j]=str[k];
 stri[j 1]=' ';
 k ;
 }
 stri[j-1]='\0';
 return(stri);
}

首先撇去格式不谈了吧……我们来看看程序要实现的效果是什么吧。

用puts语句输出字符 把输入字符,中间用空格隔开

那么在函数中他似乎确实做到了这一点,可是程序却挂了,这是为什么呢?

刚开始我也思考了好一会儿,后来多方查证之后回想起来了。

我们来看一下char tra(char str[])里面的是参数,参数是什么意思,它传递的是一个数组吗?不是,传递的其实是指向数组第一个元素的指针,换句话说,这是一个指针,然后再来看看返回值return(stri),他是一个数组吗?也不是,他只是一个地址罢了,如果我们printf("%p", tra(b));就会看到这个地址了,这并不是字符串,自然用puts()程序会挂。

那么我们能不能使用指针来操作呢?总之,它报错了,因为返回类型不对,所以不能用*来解决问题,同时这涉及到作用域的问题,因为stri其实在return完了之后就已经消失了,如果我们用传统的return值赋值的方法,后来就找不到地址所对应的数值了(这点应该说错了……)修正请见本文最后。

因此我就换了自己熟悉的方案:

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy6825')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy6825>#include <stdio.h>
#include <string.h>
void tra(char str[], char stri[]);
int main(void)
{
 char b[80], c[80] = {0};
 gets(b);
 tra(b, c);
 puts(c);
return 0;
}
void tra(char str[], char stri[])
{
int i,j,k=0;
i=strlen(str); //5
for(j=0;j<=2*i-1;j=j 2) // j <= 9
 {
 stri[j]=str[k]; // h e l l o\0
 stri[j 1]=' ';
 k ;
 }
 stri[j-1]='\0';
}

这样子就能保证数组可以正常输入输出了,因为它的作用域不仅在此函数内部。

当然,后来学霸还问了某些类似于这样行不行的问题,在最终实践之后得出了一系列结论。

当然,以下都是错误的设计,请勿参考。

如:
将函数定义为,输出指针,那样输出类型就对上号了。

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy8949')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy8949>#include <stdio.h>
#include <string.h>
int main()
{
 char *tra(char str[]);
 char b[80], *p, c[80], d;
 gets(b);
 strcpy(c, tra(b));
 p = tra(b);
 puts(c);
 printf("%c", tra(b)[2]);
 return 0;
}
char *tra(char str[])
{
 char stri[80];
 int i,j,k=0;
 i=strlen(str);
 for(j=0;j<=2*i-1;j=j 2)
 {
 stri[j]=str[k];
 stri[j 1]=' ';
 k ;
 }
 stri[j-1]='\0';
 return(stri);
}

这样也可以正常输出。(注:C是无法用==来赋值数组的。)
或者是这样。

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy6752')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy6752>#include <stdio.h>
#include <string.h>
int main()
{
char *tra(char str[]);
char b[80];
gets(b);
//puts(tra(b));
puts(tra(b));
return 0;
}
char stri[80];
char *tra(char str[])
{
int i, j, k = 0;
i = strlen(str);
//for(i=0;str[i]!='/0';i );
for (j = 0; j <= 2 * i - 1; j = j 2)
{
stri[j] = str[k];
stri[j 1] = ' ';
k ;
}
stri[j - 1] = '\0';
return(stri);
}

这里将stri写作外部变量,也是可以的。

为什么说以上失败,归根结底在于不可控制,自动变量消失了之后内存里的数据是否存在是个很大的问题。

您可能感兴趣的文章:
Golang学习笔记(五):Go语言与C语言的区别
C语言复习笔记之数据结构详解
go run main.go 参数_Go语言入门:Hello world
Golang笔记:语法,并发思想,web开发,Go微服务相关
想系统学习GO语言(Golang
C语言中函数 与 指针学习笔记
php数组的索引的学习笔记
C语言中变量定义/声明深入分析
php学习笔记之数组遍历的代码举例
go 语言学习历程

[关闭]
~ ~