C语言中函数的返回值(集锦5篇)由网友“圆脑壳小狗”投稿提供,下面是小编整理过的C语言中函数的返回值,希望能帮助到大家!
篇1:C语言中函数的返回值
如果某个函数从一个地方返回时有返回值,而从另一个地方返回时没有返回值,该函数并不非法,但可能是一种出问题的征兆,”
这句话觉得有些难以理解。
于是写了段测试代码,如下:
#include
int f(int i) {
if (1)
return;
else
return 1;
}
main(void) {
int i = -10;
printf(“%d\n”, f(i));
}
/*
* 本程序用gcc编译没有问题,
* 运行结果如下:
* -10
*/
篇2:C语言中调用Lua函数实例
这篇文章主要介绍了C语言中调用Lua函数实例,本文讲解了调用一个Lua函数的步骤和C语言调用Lua函数实例,需要的朋友可以参考下
记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪,那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。
在lua API中,调用一个函数的步骤很简单:
1.压入你要调用的函数,使用lua_getglobal。
2.压入调用参数。
3.使用lua_pcall
4.从栈中弹出结果。
举例说明,假设你有这么一个lua函数:
代码如下:
function f (x, y)
return (x^2 * math.sin(y))/(1 - x)
end
那么,我们就可以定义个c函数来封装这个调用:
代码如下:
/* call a function ‘f‘ defined in Lua */
double f (double x, double y)
{
double z;
lua_getglobal(L, “f”);
lua_pushnumber(L, x);
lua_pushnumber(L, y);
/* do the call (2 arguments, 1 result) */
if (lua_pcall(L, 2, 1, 0) != 0)
error(L, “error running function ‘f‘: %s”,
lua_tostring(L, -1));
if (!lua_isnumber(L, -1))
error(L, “function ‘f‘ must return a number”);
z = lua_tonumber(L, -1);
lua_pop(L, 1);
return z;
}
lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,
如果lua_pcall运行出错,那么会返回个非0值。
(完)
篇3:c语言中字符串函数的使用
#include
#include
/*
char s1[]=“I am a student”;
char s2[20]=“teacher”;
char s3[]=“student”;
int result;
char s4[20],*p;
1.串的长度
int strlen(char *str):
printf(“%d\n”,strlen(s1));//长度为14
printf(“%d\n”,strlen(s2));//长度为7
2.复制
char *strcpy(char *str1,char *str2):
strcpy(s4,s2);//把s2复制给s4
printf(“%s\n”,s4);//输出teacher
3.比较
int strcmp(char *str1,char *str2):
result=strcmp(s2,s3);
printf(“%d\n”,result);//s2>s3
4.字符串定位
char *strchr(char *str,char ch);
p=strchr(s1,'s');//p指向在s1中字符's'的位置
printf(“%s\n”,p);//输出student
5.子串查找
char *strstr(char *s1,char *s2);
p=strstr(s1,s3);//p指向在s1中字符's'的位置
printf(“%s\n”,p);//输出student
6.连接
char * strcat(char *str1,char *str2):
strcat(s2,s3);
printf(“%s\n”,s2);//输出teacherstudent
*/
void ReverseName(char *name,char *newName){
char *p;
p=strchr(name,' ');//字符定位
*p='\0';
printf(“%s\n”,name);
printf(“%s\n”,p);
strcpy(newName,p+1);//复制
printf(“--%s\n”,newName);
strcat(newName,“,”);//连接
strcat(newName,name);//连接
*p=' ';
printf(“%s\n”,name);
}
int main{
char name[]=“jie wang”,newName[30];
ReverseName(name,newName);
printf(“hello world\n”);
return 0;
}
篇4:浅谈C语言中scanf,gets,getchar函数区
众所周知,scanf函数和gets函数是从键盘输入数据的函数,其基本函数功能这里不做过多赘述,只对两个函数易错点深入分析。
int main(){ char a[20]; char b[20]; char c[20]; printf(“请输入a字符串\n”); scanf(“%s”,&a); printf(“请输入b字符串\n”); gets(b); printf(“请输入c字符串\n”); gets(c); return 0;}
【分析】程序本意是输入三个字符串,之所以用printf提示输入是因为想更清楚地看清程序怎么运作的,可以从运行界面看到程序提示输入a字符串和c字符串,但是会越过b字符串不让输入。这里会让人感到困惑。
因为scanf函数在读取字符串时,遇到回车、空格、制表符不会进行读取或转换,会舍弃掉它们以及它们后面的字符至缓冲区,最后在读取的字符后面加上‘\0’.因此到了gets(b)的时候就会读取缓冲区剩下的东西以及最后的换行符就结束了,所以程序不会提示输入b字符串,但是从监视可以看到b中其实是读取了字符串的。然后缓冲区无剩余字符gets(c)可以实现输入c字符串。而且从这个程序也可以体现出来需要用到里面有空格的字符串的时候可以用gets函数。
这里还有一个注意点:在gets(c)读取从键盘输入的字符以及最后需要将缓冲区的数据刷新出去的回车符,
它和scanf不同的是不会舍弃回车符至缓冲区中, 而是会丢弃换行符将其改为字符串结束标志‘\0’。所以我们一般喜欢使用这种带有清理收尾工作的输入函数。
最后一个点,我们可以看到b字符串其实读取的是缓冲区中的垃圾数据。因此,为了避免输入流缓冲区中垃圾数据对后续读入的影响,需要清空缓冲区。
下面就介绍方法(不同平台)
C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。
对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)
scanf函数读取字符
int main(){ char ch1; char ch2; char ch3; char ch4; scanf(“%c”,&ch1); scanf(“%c”,&ch2); scanf(“%c”,&ch3); scanf(“%c”,&ch4); return 0;}
篇5:C语言中函数和指针的参数传递
最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西,
大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的。所以就产生了一些东西。和我们本来想的有差别。
一、明确C语言中函数的入口:
C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来参数的一个副本,也就是说这两个参数虽然名字一样,对应的值一样,但是他们两个对应的内存地址是不一样的,也就是说这就是两个“看上去一模一样”的完全不同的变量。
所以一定要知道,C语言中函数是值传递的,也就是说,C语言只能把值传给函数,而不能把你想要传递的变量完全的放进函数内部。
二、指针传递给函数:
指针作为一个特殊的东西,他的强大之处就在于指针可以直接修改内存地址上的数据。虽然指针特别强大,但是他也难逃函数的限制,你传递给函数一个指针,因为是值传递,那么你在函数体内的使用的形参指针也只是一个副本,只是一个指向的值和你传进来的那个指针一样的一个另外的一个变量。也就是说他和普通常量是没有区别的。
三、我想要达到引用的效果怎么实现
C语言中因为是值传递的,那么我们就传递值,只要讲想要传递进函数的东西的地址传进函数,并且函数用一个指针接收,那么就相当于把这个变量地址原封不动的传递给了函数,形参的指针指向的是外面传进来的地址,有了地址不就好办了吗。
四、下面是我写的一个二叉树建立的一个无返回值的版本:
因为二叉树是用递归建立的,就像建立链表一样,一个节点一个节点建立,如果不获得上一个节点的地址,你怎么把链表连接起来呢,链表就散开了。
所以只能通过传递地址来达到找到已经建好的链表的前驱,才能把各个节点穿起来。
#include 注意看树的建立那个函数,我每次都是穿进去一个节点的地址,然后通过地址来找到已经建立好的树,才能将树建立起来, 那么有的人会问了?为什么不是下面这个写法呢? void initTree(Tree *T) { char ch; ch = getchar(); if (ch == '#') { T = NULL; } else { T = (Tree *)malloc(sizeof(Tree)); T->t = ch; initTree(T->lchild); initTree(T->rchild); }} 这种写法,你每次传进来的都是一个变量,说过,c语言是值传递的,那么每次你申请的节点空间都是给副本申请的,然后递归的是副本的左右孩子,也就是说你的树根本没有建立起来,因为每次申请的内存都没有连接上。 为什么我的那个写法可以呢,因为我是用一个指向指针的指针来存地址的,我给传进来的地址申请了内存,也就相当于给穿进来的那个节点本身申请了内存,而不是给副本,所以二叉树就顺其自然建立起来了。 最后记住,c语言是值传递的,任何东西传递给函数的都只是值! ★ php 面试题 【C语言中函数的返回值(集锦5篇)】相关文章: Lua数据类型介绍2022-08-18 c语言实践报告总结2023-03-20 Linux操作系统下的多线程编程详细解析2022-12-20 学员必须了解的C语言技术2023-09-23 C语言嵌套注释2022-09-23 java面试题及答案2023-12-27 vba心得体会2022-05-03 excel中如何自定义函数2023-05-07 Excel中CONCATENATE函数介绍2023-08-25 Python中使用items方法返回字典元素对的教程2022-09-02