从键盘任意输入不超过100个字符的字符串,该字符串只包含数字字符和空格

从键盘任意输入不超过100个字符的字符串,该字符串只包含数字字符和空格,按要求完成如下操作:
不能使用全局变量
1. 编写一个函数完成字符串的输入操作,并且在main函数中将输入的字符串输出到屏幕上。
2. 编写一个函数,从字符串中以空格为分隔符提取所有整数,如果某个整数超过3位数字,则从左向右按3位数字宽度将整数分割成多个整数,特别注意,数字0不作为整数的起始数字。并在main函数中将提取的所有整数输出到屏幕上,每个整数占5列,右对齐。整数提取样例如下:
字符串: 12345 78987 04563
则提取的整数为:123,45,78,987,456,3
3. 编写一个函数计算第2步提取的所有整数中的最大值、最小值和平均值,并在main函数中输出该最大值、最小值和平均值。输出格式如下:
最大值:(5列,右对齐)
最小值:(5列,右对齐)
平均值:(7列,2位小数,右对齐)

主要程序部分给你写了。输出格式你可以修改满足你的需要。

输入格式 允许 前面有任意空格,中间分隔符为1个或多个空格,数据后允许任意个空格(不知道是不是有这样花里胡哨的要求)。

#include <stdio.h>
#include <stdlib.h>
void f1(char *s){
printf("input one line string\n");
gets(s);
printf("your input is:\n%s\n",s);
}
void f2(char *s, int *x, int *n){
char ss[100];
int i,j,k,nn;
for (i=0;i<strlen(s);i++) if (s[i]!=' ') {k=i;break;}
if (k!=0) for (i=k;i<=strlen(s);i++) s[i-k]=s[i];
for (i=strlen(s);i>0;i--) if (s[i-1]==' ' && s[i]==' ') for (j=i;j<=strlen(s);j++)s[j]=s[j+1];
printf("string is:\n%s\n",s);
k=0;
nn=0; sscanf(s,"%s",ss);
for (j=0;j<strlen(ss);j=j+3) {sscanf(&ss[j],"%3d",&x[nn]);nn++;};
while(1) {
k = k+strlen(ss)+1;
if (k > strlen(s)) break;
sscanf(&s[k],"%s",ss);
for (j=0;j<strlen(ss);j=j+3) {sscanf(&ss[j],"%3d",&x[nn]);nn++;}
} ;
*n=nn;
}

void f3(int *x, int n, int *mx, int *mi, float *ave){
int i;
*mx=x[0]; *mi=x[0]; *ave=0.0;
for (i=0;i<n;i++) {
*ave = *ave+x[i];
if (x[i]> *mx) *mx=x[i];
if (x[i]< *mi) *mi=x[i];
}
*ave = * ave / (float) n;
}
main(){
char str[120];
int x[100],n;
int mx,mi;
float ave;
int i;
f1(str);
f2(str,x,&n);
for (i=1;i<=n;i++) {printf("%4d",x[i-1]); if (i%5==0) printf("\n"); else printf(",");};
f3(x, n, &mx, &mi, &ave);
printf("\nmax=%5d min=%5d ave=%7.2f\n",mx,mi,ave);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
相似回答