(C语言)输入一串字符,直到输入一个星号为止,

统计(输出)其中的正整数和负数个数,以及所有正整数的平均值和所有负数的平均值。

#include <stdio.h>
main()
{ char c[100];
int i;
for(i=0 ; (c[i++]=getchar())!=‘*’ ; )
printf("%c ",c[i]);
}
这个可以输入一个字符串,直到星号。
但是字符串里面怎么会有正负统计呢?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-19
心情好,给你写了一个,功能基本正确,就是没有写保证输入合法的部分。
注意:因为你未指定,两个数之间用什么分隔,所以,我暂时用的英文逗号。

/*
输入一串字符,直到输入一个星号为止;
统计(输出)其中的正整数和负数个数,以及所有正整数的平均值和所有负数的平均值.
*/

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define STR_LENGTH 256 //max str length

//str->缓存区, tail->结束符, length->缓存区长度、字符串实际长度
//注意:
//在输入不正确的情况下,比如输入2-3,此程序不能保证结果正确
int InputString(char *str, char *separates, char *tails, int *length )
{
int i, len;

len = *length;
printf("请输入一串字符,以 %s 分隔, 以 %s 结尾:\n", separates, tails );
for ( i=0; i<len; i++ )
{
str[i] = getchar();

//不接受非法字符,除了数字、'+'、'-'、分隔符、结束符之外的字符
if( (str[i]<'0' || str[i]>'9')
&& ( '-' != str[i] )
&& ( '+' != str[i] )
&& ( NULL == strchr(tails, str[i]) )
&& ( NULL == strchr(separates, str[i]) ) )
{
printf("输入非法字符,程序结束。\n");
return -1;
}

//下面的处理,结束符会占一个位置,有效字符长度是最大长度减1
if( NULL != strchr( tails, str[i] ) )
break;
}
fflush( stdin );

if( i>= len )
{
printf( "输入的字符串过长,只能处理长度 %d 以内的字符串。\n", len );
return -1;
}

//输出的字符串长度不包含结束
str[i] = 0;//去掉可能存在的*
*length = i;
return 0;
}

//str->输入字符串, length->字符串长度, separates->分隔符字符串
//注意:
//strtok 线程不安全,可以查相似的函数,也可以自己写
//此函数会改变输入字符串
int StatisticsNumbers( char *str, int length, char *separates )
{
char *pStr; //处理后首个数字对应字符串
int curNum; //当前数
int posCount, posSum; //正数数目,正数的和
int negCount, negSum; //负数数目,负数的和
double posAvg, negAvg;

posCount = 0;
posSum = 0;
negCount = 0;
negSum = 0;

pStr = strtok( str, separates );
if( 0 == pStr )
{
printf( "字符串处理失败,请检查输入。\n" );
return -1;
}
while( 0 != pStr)
{
curNum = atoi( pStr );
if( curNum < 0 )
{
negCount++;
negSum += curNum;
}
else
{
posCount++;
posSum += curNum;
}

//取下一个数
pStr = strtok( NULL, separates );
}

posAvg = ( posCount > 0 ) ? ( (double)posSum/posCount ) : 0;
negAvg = ( negCount > 0 ) ? ( (double)negSum/negCount ) : 0;
printf( "其中,正数有 %d 个,所有正数的平均值是 %f; 负数有 %d 个,所有负数的平均值是 %f。\n",
posCount, posAvg, negCount, negAvg );

return 0;
}

int main(int argc, char* argv[])
{
//TestCylinderVolume();
//InputStrings();

char str[STR_LENGTH];
char separates[] = ",";
char tails[] = "*";
int length;
int rv;
char ans;

do
{
length = STR_LENGTH;
memset( str, 0, length );

rv = InputString( str, separates, tails, &length );
if( rv != 0)
{
printf( "InputString error.\n" );
return 0;
}

printf( "输入的字符串是:\n%s\n", str );

rv = StatisticsNumbers( str, length, separates );
if( rv != 0)
{
printf( "InputString error.\n" );
return 0;
}

printf("是否继续?(输入y继续)\n");
scanf( "%c", &ans );
fflush( stdin );
} while ( 'Y'== ans || 'y' == ans );

return 0;
}本回答被提问者和网友采纳
第2个回答  2012-11-19
你的这是啥要求啊,字符串里面有蒸熟和复述的输入吗?追问

只输入正数及负数,然后输入*号退出并显示结果.

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网