这是要求
要求纯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;
}