编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。 ①在程序中用全局变量。编译和运行程序,分析结果。讨论为什么要用全局变量。 ②能否不用全局变量,修改程序并运行之。
时间: 2024-02-11 16:09:33 浏览: 22
好的,我来回答你的问题。
下面是使用全局变量的程序:
```c
#include <stdio.h>
#include <ctype.h>
int letter_count = 0, digit_count = 0, space_count = 0, other_count = 0;
void count(char str[])
{
int i = 0;
while (str[i] != '\0')
{
if (isalpha(str[i]))
letter_count++;
else if (isdigit(str[i]))
digit_count++;
else if (isspace(str[i]))
space_count++;
else
other_count++;
i++;
}
}
int main()
{
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
count(str);
printf("字母个数:%d\n", letter_count);
printf("数字个数:%d\n", digit_count);
printf("空格个数:%d\n", space_count);
printf("其他字符个数:%d\n", other_count);
return 0;
}
```
这个程序会统计输入的字符串中字母、数字、空格和其他字符的个数,并使用全局变量来存储这些计数器的值。全局变量的优点是在函数之间共享数据,可以减少参数传递的复杂性和开销。但是全局变量的缺点是容易被误用或者滥用,可能会导致代码的可读性和维护性下降。
如果不想使用全局变量,可以将计数器作为参数传递给函数,如下所示:
```c
#include <stdio.h>
#include <ctype.h>
void count(char str[], int *letter_count, int *digit_count, int *space_count, int *other_count)
{
int i = 0;
while (str[i] != '\0')
{
if (isalpha(str[i]))
(*letter_count)++;
else if (isdigit(str[i]))
(*digit_count)++;
else if (isspace(str[i]))
(*space_count)++;
else
(*other_count)++;
i++;
}
}
int main()
{
char str[100];
int letter_count = 0, digit_count = 0, space_count = 0, other_count = 0;
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
count(str, &letter_count, &digit_count, &space_count, &other_count);
printf("字母个数:%d\n", letter_count);
printf("数字个数:%d\n", digit_count);
printf("空格个数:%d\n", space_count);
printf("其他字符个数:%d\n", other_count);
return 0;
}
```
这个程序和前一个程序的功能是相同的,但是使用了参数传递来代替全局变量。函数 `count` 接收了指向计数器变量的指针,并在函数内部更新了这些变量的值。这种方法可以避免全局变量带来的问题,但是需要增加函数参数的数量,可能会增加代码的复杂性。