C语言指针做形参 问题

题目要求:在fun函数中 将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中。我的疑问是1、他给出的答案代码中 形参中 char*s ,s不是一个指针吗,为什么下面变成了数组s[i]? 2、if语句中 应该是s[i]%2==1; 答案为什么可以省略==1; 3、为什么运行崩溃 说 Debug assertion failed。代码如下#include <stdio.h>#include <string.h>void fun(char *s, char t[]){ int i=0,j=0; for(i=0;i<strlen(s);i++) if(!((i%2)==0 &&(s[i]%2))) t[j++]=s[i]; t[j]=0; }void main(){ char s[100], t[100];void NONO (); printf("\nPlease enter string S:"); scanf("%s", s); fun(s, t); printf("\nThe result is: %s\n", t); NONO();}void NONO (){/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ char s[100], t[100] ; FILE *rf, *wf ; int i ; rf = fopen("in.dat","r") ; wf = fopen("out.dat","w") ; for(i = 0 ; i < 10 ; i++) { fscanf(rf, "%s", s) ; fun(s, t) ; fprintf(wf, "%s\n", t) ; } fclose(rf) ; fclose(wf) ;}

第1个回答  2018-07-20
出现BUG的问题不太清楚,但是解决方法是你得把生成的debug.exe删掉,是代码生成错误后,找不到debug的执行文件才会这样,你删掉以后重新生成一次,还是不行就是代码挂了。然后问题的原因我大概看了一下,你在fun()里char了一个指向s的指针,但是这个s是局部的,所以说s的生命周期到fun()语句结束就释放掉了,而main函数里的s是你另开辟的一个100元素的字符数组,它只代表数组,并不会调用fun()里的s,建议你内存分配先看一下,特别是堆栈这一块。追问

t字符串里最后放一个结束字符,不应该是t[j]='\0'吗,他为什么可以写成 t[j]=0?

追答

一个数组如果只有前几个有值,后面的自动补成结束符,不需要写
小伙子 多看看指针,书读百遍其义自见

本回答被网友采纳
第2个回答  2018-07-20
没有排版的代码看得很累,问题1:数组作函数参数会退化为指针,所以一般也需要传入数组的大小。问题2:因为==1就是真,是逻辑判断,此处只关心是0还是非零。问题3一般是数组越界或者操作未初始化的指针,代码实在比较乱,就没细看了。追问

我想问的是:fun的第一个参数 char *s ,s表示的是指针,为什么 fun内 s[i]这里 s又变成了数组。
&&左右两边是布尔型,s[i]%2 他的值可能是1可能是0,题目要求排除 s[i]%2==1的情况,不写==1 他是怎么判断是否为1的?

追答

第1个问题,需要再加强一下指针的学习,指针和数组的关系。指针也可以有下标操作,假设p是指针,p[1]等价于p+1,即指向下一个该类型的存储单元,和数组效果一致,但数组名不可以作+操作。第2个问题,给你举个形象的例子:while(*p){……;p++;},p是一个指向字符串的指针,此时的意思是,p只要不指向'\0',就遍历该字符串,也是巧妙地省略了,本应该是:while(*p != '\0')。回到题目s[i]%2如果为1,不写的话它就是真,写了的话就是1==1,也是真,是不是一样呢

追问

还有一个问题,t字符串里最后放一个结束字符,不应该是t[j]='\0'吗,他为什么可以写成 t[j]=0? \0的ascii码是0 功能是null,0不就是一个数字吗。

追答

嗯嗯,这个你的理解是正确的。至于他这样写能不能正确我不确定,但提倡你说的规范写法。

经测试:

所以数组初始化时的0和后来单独赋值的0意义应该不一样

本回答被提问者采纳
相似回答