各位,C语言代码求改!😭😭

这是要求

img

要求纯C语言,怎样才能运行成功,这要怎么改。代码如图。
#include<stdio.h>
int one()
{
{
char str[80];
int i, a= 0,b= 0, c= 0;
printf("请输入字符串:\n");
gets(str);
for (i = 0; str[i] != '\0'; i++)
{
if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z')
a++;
if (str[i] == ' ')
b++;
if (str[i] != ' ')
if (str[i + 1] == ' ' || str[i + 1] == '\0')
c++;
}
printf("英文字母个数为%5d个,空格个数为%5d个,单词个数为%5d个 \n", a, b, c);
return 0;
}
int two()
{
char str[20];
int i,sum=0;
printf("请输入字符串:\n");
gets(str);
for (i = 0; str[i + 1] != ' ' || str[i + 1] != '\0'; i++)
{
sum=sum+str[i]-48;
}
printf("字符串中所有正整数之和为:%d\n",sum);
return 0;
}
int tree()
{
char str[80];
int i, sum=0,quadrature=1;
printf("请输入字符串:\n");
gets(str);
for (i = 0; str[i + 1] != ' ' || str[i + 1] != '\0'; i++)
{
sum=sum+str[i]-48;
quadrature=quadrature*str[i]-48;
}
printf("字符串中所有正整数之和为:%d,所有正整数之积为:%d\n",sum,quadrature);
return 0;
}
int main()
{
char operation;
printf("第一种字符串(1)\n");
printf("第二种字符串(2)\n");
printf("第二种字符串(3)\n");
printf("对应字符串类型的序号: ");
scanf("%s",&operation);
switch(operation)
{
case 1:
one();
break;
case 2:
two();
break;
case 3:
tree();
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
return 0;
}

改了一下,原代码少了一个}

#include <stdio.h>
int one() {
  {
    char str[80];
    int i, a = 0, b = 0, c = 0;
    printf("请输入字符串:\n");
    gets(str);
    for (i = 0; str[i] != '\0'; i++) {
      if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z')
        a++;
      if (str[i] == ' ')
        b++;
      if (str[i] != ' ')
        if (str[i + 1] == ' ' || str[i + 1] == '\0')
          c++;
    }
    printf("英文字母个数为%5d个,空格个数为%5d个,单词个数为%5d个 \n", a, b, c);
    return 0;
  }
}
  int two() {
    char str[20];
    int i, sum = 0;
    printf("请输入字符串:\n");
    gets(str);
    for (i = 0; str[i + 1] != ' ' || str[i + 1] != '\0'; i++) {
      sum = sum + str[i] - 48;
    }
    printf("字符串中所有正整数之和为:%d\n", sum);
    return 0;
  }
  int tree() {
    char str[80];
    int i, sum = 0, quadrature = 1;
    printf("请输入字符串:\n");
    gets(str);
    for (i = 0; str[i + 1] != ' ' || str[i + 1] != '\0'; i++) {
      sum = sum + str[i] - 48;
      quadrature = quadrature * str[i] - 48;
    }
    printf("字符串中所有正整数之和为:%d,所有正整数之积为:%d\n", sum,
           quadrature);
    return 0;
  }
  int main() {
    char operation;
    printf("第一种字符串(1)\n");
    printf("第二种字符串(2)\n");
    printf("第二种字符串(3)\n");
    printf("对应字符串类型的序号: ");
    scanf("%s", &operation);
    switch (operation) {
    case 1:
      one();
      break;
    case 2:
      two();
      break;
    case 3:
      tree();
      break;
    default:
      printf("输入错误,请重新输入!\n");
      break;
    }
    return 0;
  }

一、语法错误
1、one方法里面第一行多了个{,把它删了

二、逻辑错误
1、main里面switch里的case标签错误,应该是字符而不是数字,而且scanf里面应该是%c而不是%s:

    scanf("%c", &operation);
    switch (operation) {
    case '1':
        one();
        break;
    case '2':
        two();
        break;
    case '3':
        tree();
        break;
    default:
        printf("输入错误,请重新输入!\n");
        break;
    }

2、在输入operation后,如果按下回车键,这个回车键会被gets方法接收到,gets方法一接收到回车键后就结束了,所以后面没法再输入,应该需要两个gets,第一个gets来接收operation后的回车键,第二个gets来读取字符串, 也就是这三个方法都要使用两个gets(str):

    printf("请输入字符串:\n");
    // 第一个gets跳过operation后面的回车键
    gets(str);
    // 第二个gets读取字符串
    gets(str);

3、第二个问题应该是要你解析整数,然后相加,
比如:
输入abc123efg456
它应该是要你用123去加456,即123+456=579,而不是1+2+3+4+5+6
应该改成:

int two() {
    char str[2048];
    int i = 0, sum = 0;
    printf("请输入字符串:\n");
    gets(str);
    gets(str);
    int l = strlen(str);
    while (i < l)
    {
        // 跳过非数字字符
        while(!isdigit(str[i]))
        {
            ++i;
            continue;
        }

        int num = 0;
        while (isdigit(str[i]))
        {
            num *= 10;
            num += str[i] - '0';
            ++i;
        }
        sum += num;
    }
    printf("字符串中所有正整数之和为:%d\n", sum);
    return 0;
}

4、第三个问题应该是要你解析大整数,然后相加,相乘
比如
输入:123456789101 101987654321
结果应该是123456789101+101987654321 和 123456789101*101987654321,而不是每个字符相加相乘

三、完整代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int one() {
    char str[80];
    int i, a = 0, b = 0, c = 0;
    printf("请输入字符串:\n");
    gets(str);
    gets(str);
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z')
            a++;
        if (str[i] == ' ')
            b++;
        if (str[i] != ' ')
            if (str[i + 1] == ' ' || str[i + 1] == '\0')
                c++;
    }
    printf("英文字母个数为%5d个,空格个数为%5d个,单词个数为%5d个 \n", a, b, c);
    return 0;
}
int two() {
    char str[2048];
    memset(str, 0, sizeof(str));
    int i = 0, sum = 0;
    printf("请输入字符串:\n");
    gets(str);
    gets(str);
    int l = strlen(str);
    while (i < l)
    {
        // 跳过非数字字符
        while (!isdigit(str[i]))
        {
            ++i;
            continue;
        }

        int num = 0;
        while (isdigit(str[i]))
        {
            num *= 10;
            num += str[i] - '0';
            ++i;
        }
        sum += num;
    }
    printf("字符串中所有正整数之和为:%d\n", sum);
    return 0;
}

#define MAX_SIZE 1024
typedef struct { char num[MAX_SIZE]; int size; }big_integer_t;
void init_big_integer(big_integer_t* n)
{
    memset(n->num, 0, sizeof(n->num));
    n->size = 0;
}
void add_big_integer(const big_integer_t* lhs, big_integer_t* rhs, big_integer_t* result)
{
    int lhsi = lhs->size - 1, rhsi = rhs->size - 1;
    result->size = 0;
    int addition = 0;
    while (lhsi >= 0 || rhsi >= 0 || addition > 0)
    {
        addition += (lhsi >= 0 ? (lhs->num[lhsi] - '0') : 0) 
            + (rhsi >= 0 ? (rhs->num[rhsi] - '0') : 0);
        result->num[result->size++] = (addition %10) + '0';
        addition /= 10;
        if(lhsi>=0)lhsi--;
        if(rhsi>=0)rhsi--;
    }
    result->num[result->size] = 0;
    strrev(result->num);
}

void mul_big_integer(const big_integer_t* lhs, big_integer_t* rhs, big_integer_t* result)
{
    big_integer_t tmp;
    init_big_integer(&tmp);
    result->size = 0;
    for (int i = rhs->size - 1; i >= 0; --i)
    {
        int rn = rhs->num[i] - '0';
        int addition = 0;
        tmp.size = 0;
        for (int j = lhs->size - 1; j >= 0; --j)
        {
            int ln = lhs->num[j] - '0';
            addition += rn * ln;
            tmp.num[tmp.size++] = addition % 10 + '0';
            addition /= 10;
        }
        while (addition > 0)
        {
            tmp.num[tmp.size++] = addition % 10 + '0';
            addition /= 10;
        }
        tmp.num[tmp.size] = 0;

        big_integer_t tmp2 = *result;
        int lhsi = 0, rhsi = (rhs->size - i - 1);
        result->size = rhsi;
        addition = 0;
        while (lhsi < tmp.size || rhsi < tmp2.size || addition > 0)
        {
            addition += (lhsi < tmp.size ? (tmp.num[lhsi] - '0') : 0)
                + (rhsi < tmp2.size ? (tmp2.num[rhsi] - '0') : 0);
            result->num[result->size++] = (addition % 10) + '0';
            addition /= 10;
            if (lhsi < tmp.size)lhsi++;
            if (rhsi < tmp2.size)rhsi++;
        }
    }
    result->num[result->size] = 0;
    strrev(result->num);
}
int tree() {
    char str[2048];
    memset(str, 0, sizeof(str));
    int i = 0, sum = 0, quadrature = 1;
    printf("请输入字符串:\n");
    gets(str);
    gets(str);
    int len = strlen(str);
    big_integer_t num0, num1, result_add, result_mul;
    init_big_integer(&num0);
    init_big_integer(&num1);
    init_big_integer(&result_add);
    init_big_integer(&result_mul);
    // 读取第一个大整数
    while (i < len && !isdigit(str[i]))++i;
    while (i < len && isdigit(str[i]))num0.num[num0.size++] = str[i++];
    num0.num[num0.size] = 0;
    // 读取第二个大整数
    while (i < len && !isdigit(str[i]))++i;
    while (i < len && isdigit(str[i]))num1.num[num1.size++] = str[i++];
    num1.num[num1.size] = 0;
    // 相加
    add_big_integer(&num0, &num1, &result_add);
    // 相乘
    mul_big_integer(&num0, &num1, &result_mul);
    printf("字符串中所有正整数之和为:%s,所有正整数之积为:%s\n", 
        result_add.num,
        result_mul.num);
    return 0;
}
int main() {
    char operation;
    printf("第一种字符串(1)\n");
    printf("第二种字符串(2)\n");
    printf("第二种字符串(3)\n");
    printf("对应字符串类型的序号: ");
    scanf("%c", &operation);
    switch (operation) {
    case '1':
        one();
        break;
    case '2':
        two();
        break;
    case '3':
        tree();
        break;
    default:
        printf("输入错误,请重新输入!\n");
        break;
    }
    return 0;
}

img