一. 定义整形数组实现
在主函数中,首先要创建一个足够大的字符数组,char[x],x根据你所输入的字符串大小来确定,能装得下就行,用来存储字符串。
传值调用中,return只能传回一个值,所以不能采用这种方式。
由题目可知,需要传回的是字母,数字,其他字符的个数。也就说,需要传回三个值,这时我们自然而然的想到了用一个数组来存放这三个值。因此,我们定义一个整形数组int num[]来存放,字母,数字,其他字符的个数。
通过gets()将字符串输入。
通过自定义的jishu函数,将字符串,num数组传给jishu函数,并在jishu函数中计算得到三个数据的具体值,同时存放进num数组中。
最后,通过printf,将结果输出在显示屏上。
for循环中的判断条件也可以写成s[i]!='/0'。目的是遇到字符串结束标志就挑出循环。
通过if else语句,逐一的对字符串中每个字符进行判断。如果条件成立,就存储到相应的数组中。由于num是数组,其内部空间是一致的。所以在jishu函数中改变,也会影响到主函数中num的变化。
代码如下:
#include <stdio.h>
void main()
{
void jishu(char s[],int num[3]);
char arr[10];
int num[3]={0};
printf("请输入字符串");
gets(arr);
jishu(arr,num);
printf("字母:%d\n数字:%d\n字符%d\n",num[0],num[1],num[2]);
}
void jishu(char s[],int num[])
{
int i;
for(i=0; s[i]; i++)
{
if('a'<=s[i]&&s[i]<='z'||'A'<=s[i]&&s[i]<='Z')
num[0]++;
else if('0'<=s[i]&&s[i]<='9')
num[1]++;
else
num[2]++;
}
}
二.定义全局变量实现
全局变量:
在函数之外定义的变量称为全局变量,也称为外部变量。有效范围为从定义变量的位置开始到本源文件结束。全局变量在编译时分配内存,且在程序的全部执行中都占用内存。
通过上述定义可以得知,我们定义的sz,zm,zf这三个变量,其不但可以在主函数中起作用,同时也可以在自定义的jishu函数中起作用。在编译时分配内存,全部执行中都占用内存意味着,自定义jishu函数中的变量与主函数中的变量一直共用一块空间,所以可以相互影响。
这时,我们只需要向自定义的jishu函数传入一个字符串。所以,形参只有一个字符数组就行。
代码如下:
#include <stdio.h>
int sz=0,zm=0,zf=0;
void main()
{
void jishu(char s[]);
char arr[10];
printf("请输入字符串");
gets(arr);
jishu(arr);
printf("字母:%d\n数字:%d\n字符%d\n",sz,zm,zf);
}
void jishu(char s[])
{
int i;
for(i=0; s[i]; i++)
{
if('a'<=s[i]&&s[i]<='z'||'A'<=s[i]&&s[i]<='Z')
zm++;
else if('0'<=s[i]&&s[i]<='9')
sz++;
else
zf++;
}
}
附:变量重要概念
变量的作用域:指变量能被读写访问的范围,与变量定义位置密切相关。
按作用域不同,变量可以分为局部变量和全局变量。
局部变量:在一个函数内部定义的变量称为局部变量,也称内部变量。有效范围为从定义变量的位置开始到本函数或本复合语句结束。局部变量在函数调用时分配内存,调用结束,内存被释放。(这一点也就注定了,不同函数内的变量根本无法相互影响,名称无论相不相同,其内部空间根本就不一样。)
同时需要注意,当全局变量和局部变量重名时。由定义可知,他们都有可能起作用,但究竟是谁起作用呢。通俗来讲,强龙不压地头蛇。这全局变量是条强龙,但是在局部变量的地盘上还得是局部变量这地头蛇作用做主。
即,若在同一源程序文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,不起作用。