C语言的问题,关于函数的调用

编写一函数,由实参传来一个字符串,统计此字符串中英文字母、数字、空格和其它字符的个数。在主函数中输入字符串,然后调用该函数完成相应统计,并在主函数中输出上述统计结果。

参考如下:

#include <stdio.h>
#include <ctype.h>

int main() 
{
    char str[100]; 
    int letters = 0, digits = 0, spaces = 0, others = 0;  

    printf("请输入:");
    gets(str);

    int i = 0;
    char c;  // 存放当前字符
    while ((c = str[i++]) != '\0') 
    {  
        if (isalpha(c)) 
            letters++;
        else if (isdigit(c))  
            digits++;
        else if (isspace(c))
            spaces++;
        else 
            others++;
    }

    printf("包含:\n");
    printf("英文字母 %d 个\n", letters);
    printf("数字 %d 个\n", digits);
    printf("空格 %d 个\n", spaces);
    printf("其它字符 %d 个\n", others);

    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7707954
  • 你也可以参考下这篇文章:【C语言】编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
  • 除此之外, 这篇博客: C语言基本栈操作之字符串数字分隔与求数据的个数和最值中的 要求编写一个函数,将整数字符串分割到一个字符串链表中,然后将字符串链表中存储的整数串转换成整数,存储到一连续的存储空间中,最后输出整数的个数及最大数和最小数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include <time.h>
    #include <string.h>
    #define MAXSIZE 20
    //从键盘输入一行以“,”分隔的一组整数,求数据的个数,数据的最大值,最小值,并输出。
    //要求编写一个函数,将整数字符串分割到一个字符串链表中,然后将字符串链表中存储的整数串转换成整数,
    //存储到一连续的存储空间中,最后输出整数的个数及最大数和最小数。
    //d = atof(op); //不是运算符,就肯定是因数了。所以,用atof函数,将字符串转换为double类型/浮点数   
    
    typedef struct node {		//定义栈结构
    	char data;		// 队列元素类型为char 
    	struct node *next;
    }Stack;
    
    char *Input(char item[MAXSIZE]);  //输入字符数字元素
    double *String_Deal(char item[MAXSIZE], Stack **str); //整数字符串分割到一个字符串链表中,然后将字符串链表中存储的整数串转换成整数										 
    void Init_Stack(Stack **s);//建立栈空间,初始化栈
    Stack *Push_Stack(Stack **top, char x);  //入栈
    Stack *Pop_Stack(Stack **top, char x);  //出栈
    void *Output_Stack(Stack *num);  //输出栈元素
    char *Input(char item[MAXSIZE]);  //输入字符数字元素,存放到数组
    void Prt(double figure[]);  //数字元素遍历,求数据的个数,数据的最大值,最小值,并输出
    
    void main()
    {
    	char arr[MAXSIZE] = {0};  //存放输入的原始字符串
    	Stack *number;   //存放分割后的字符串链表
    	double figure[MAXSIZE];  //用数组存放转换后的数字
    	Input(arr);  //输入字符数字元素
    	Init_Stack(&number);
    	String_Deal(arr, &number);
    	Output_Stack(number);//输出分隔后栈内字符元素
    	//figure[MAXSIZE] = *String_Deal(arr, &number);
    	//Prt(figure); //数字元素遍历,求数据的个数,数据的最大值,最小值,并输出
    }
    
    //整数字符串分割到一个字符串链表中,然后将字符串链表中存储的整数串转换成整数
    double *String_Deal(char item[MAXSIZE], Stack **result)//item为输入的字符串
    {
    	char *buf = item; //声明buf saveptr两个变量,是strtok_r函数的需要。  
    	char *saveptr = NULL;
    	char *op; //分隔后的每个字符数字或字符符号 
    	Stack *p;  //p指向入栈后的数字字符
    	double ss;
    	//当strtok()在参数buf的字符串中发现参数","中包涵的分割字符时,则会将该字符改为\0 字符。
    	//在第一次调用时,strtok()必需给予参数buf字符串,往后的调用则将分割后的字符参数saveptr设置成buf。
    	//每次调用成功则返回指向被分割出片段的指针。
    		while ((op = strtok_s(buf, ",", &saveptr)) != NULL) //利用strtok_s函数分隔字符串
    	{
    		if (op != NULL)
    		{
    			Push_Stack(result, *op);//数字字符存入栈
    			buf = saveptr;
    		}
    	}
    	printf("字符分隔并进栈成功!正在将字符串链表中存储的整数串转换成整数......\n");
    	p = *result;
    	int j = 0;  //存放数字数组下标,从0开始存放数据
    	double figure[MAXSIZE];
    	while (p->next )
    	{
    		if (p->data >= '0'&&p->data <= '9')
    		{
    			ss = atof(&(p->data));//字符转为浮点数
    			figure[j] = ss;
    			j++;
    			p = p->next;
    			printf("figure[%d]=%3.6f\n", j, figure[j-1]);//输出分隔后的数字(浮点型)
    		}
    		printf("\n");
    	};
    	Prt(figure);  //数字元素遍历,求数据的个数,数据的最大值,最小值,并输出
    	return figure;
    }
    //建立栈空间,初始化栈
    void Init_Stack(Stack **s)//Stack *Init_Stack(Stack *s,int x)
    {
    	*s = (Stack *)malloc(sizeof(Stack));
    	(*s)->next = NULL;
    }
    
    Stack *Push_Stack(Stack **top, char x)  //入栈
    {
    	Stack *s;
    	int i = 0;
    	s = (Stack *)malloc(sizeof(Stack));
    	s->data = x; s->next = *top; *top = s;
    	return *top;
    }
    
    Stack *Pop_Stack(Stack **top, char x)  //出栈
    {
    	Stack *p;
    	if (top == NULL) return NULL;
    	else
    	{
    		x = (*top)->data ;
    		p = *top;
    		*top = (*top)->next;
    		free(p);//释放内存
    		return *top;
    	}
    }
    
    char *Input(char item[MAXSIZE])  //输入字符数字元素
    {
    	char ch;
    	int i = 0;
    	printf("从键盘输入一行以“,”分隔的一组整数,以'#'结束输入:\n");
    	ch = getchar();
    	while (ch != '#')
    	{
    		item[i] = ch;
    		i++;
    		ch = getchar();
    	}
    	return item;
    }
    void *Output_Stack(Stack *num)  //输出栈元素
    {
    	int y = 0;
    	printf("输出栈内数字元素为(最后一个为结束符):\n");
    	while (num != NULL)
    	{
    		printf("%c  ", num->data);
    		Pop_Stack(&num, y);
    	}
    	printf("\n");
    	return NULL;
    }
    void Prt(double figure[])  //数字元素遍历,求数据的个数,数据的最大值,最小值,并输出
    {
    	int i = 0;
    	if (figure[0] ==NULL)
    	{
    		printf("数组空!\n");
    	}
    	printf("数组存在的元素如下:\n");
    	double min = figure[0], max = figure[0];
    	while (figure[i]>=0)
    	{
    		printf("-->%3.3f ", figure[i]);
    		if (figure[i] <= min) min = figure[i];
    		if (figure[i] >= max) max = figure[i];
    		i++;
    	}
    	printf(" *******结束!\n");
    	printf("***数字个数为%3d个***\n", i);
    	printf("***最大数为:%3f***\n", max);
    	printf("***最小数为:%3f***\n", min);
    }
    
  • 您还可以看一下 张川老师的微信小程序开发 | 从设计效果图到程序开发上线全过程学习课程中的 变量、数组、对象、函数的定义和使用小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    我可以为您提供一种解决方案。首先,我们需要一个函数来统计字符串中各种字符的数量。下面是一个示例代码:

    void count_chars(char* str) {
        int i = 0, alpha = 0, digit = 0, space = 0, other = 0;
    
        while(str[i] != '\0') {
            if(isalpha(str[i])) {
                alpha++;
            }
            else if(isdigit(str[i])) {
                digit++;
            }
            else if(str[i] == ' ') {
                space++;
            }
            else {
                other++;
            }
    
            i++;
        }
    
        printf("英文字母个数:%d\n数字个数:%d\n空格个数:%d\n其他字符个数:%d\n", alpha, digit, space, other);
    }
    

    在该函数中,我们使用了几个变量来分别统计英文字母、数字、空格和其他字符的数量。然后,我们使用循环遍历字符串中的每个字符,使用相应的函数来判断字符属于哪一类,并增加相应的计数器。最后,我们使用printf输出结果。

    在主函数中,我们需要输入一个字符串并将其作为参数传递给count_chars函数。下面是一个示例代码:

    int main() {
        char str[100];
    
        printf("请输入一个字符串:");
        scanf("%[^\n]", str);
    
        count_chars(str);
    
        return 0;
    }
    

    在该代码中,我们首先声明一个字符数组str,用于存储输入的字符串。然后,我们使用scanf函数输入一个字符串,并将其传递给count_chars函数进行统计。

    最后,希望我的解决方案可以解决您的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
#include <stdio.h>

void tongji(char* str) {
    int letters = 0, digits = 0, spaces = 0, others = 0;
    int i = 0;
    char c;

    while ((c = str[i++]) != '\0') {
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            letters++;
        }
        else if (c >= '0' && c <= '9') {
            digits++;
        }
        else if (c == ' ') {
            spaces++;
        }
        else {
            others++;
        }
    }

    printf("英文字母个数: %d", letters);
    printf("数字个数: %d", digits);
    printf("空格个数: %d", spaces);
    printf("其他字符个数: %d", others);
}

int main() {
    char str[100];

    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);

    tongji(str);

    return 0;
}