编写一函数,由实参传来一个字符串,统计此字符串中英文字母、数字、空格和其它字符的个数。在主函数中输入字符串,然后调用该函数完成相应统计,并在主函数中输出上述统计结果。
参考如下:
#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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:代码:
#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);
}
我可以为您提供一种解决方案。首先,我们需要一个函数来统计字符串中各种字符的数量。下面是一个示例代码:
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;
}