69,336
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct Max_Minni_Aver
{
int m_max = 0;
int m_mini = 0;
int m_average = 0;
};
struct Max_Minni_Aver calc( const char *str)
{
const int len = strlen(str); //获取数组的长度
int num[len];
for (int i = 0 ; i < len ;++i)
{
num[i] = atoi(&(str[i])); //把str数组里的元素全部转换为int并存入num数组中
}
int max_value = 0;
int mini_value = 0;
//得到最大最小值
for(int i = 0; i < len;++i)
{
if (num[i]> max_value)
{
max_value = num[i];
}
else if (num[i] < mini_value)
{
mini_value = num[i];
}
}
int sum = 0;
//得出总值
for(int i = 0; i < len;++i)
{
sum +=num[i];
}
//得出平均值
int average = sum / len;
struct Max_Minni_Aver mma;
mma.m_max = max_value;
mma.m_mini = mini_value;
mma.m_average=average;
return mma;
}
int main(int argc, char *argv[])
{
FILE *p = fopen("c.txt","r");
char *line = NULL;
char str[1024];
char num[100];
int i = 0;
if (p == NULL)
{
printf("打开文件失败! %s",strerror(errno));
}
else
{
while ( fgets(str,sizeof(line),p) != NULL) //循环每一行
{
line = str;
while(*line != '\0')
{
if (*line >= '0' && *line <='9')
{
num[i] = *line; //找到数字存放到num数组里
i++;
line++; //指向字符串下一个元素
}
}
}
struct Max_Minni_Aver value = calc(num); //得到最大值,平均值,最小值
printf("最大值:%d,最小值:%d,平均值:%d",value.m_max,value.m_mini,value.m_average);
}
fclose(p);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>
#include <string.h>
#include <errno.h>
//#include <sys/types.h>
//#include <sys/stat.h>
//#include <fcntl.h>
struct Max_Minni_Aver
{
int m_max;
int m_mini;
int m_average;
};
struct Max_Minni_Aver calc( const char (*str)[32], int len)
{
int *num = (int *)malloc(sizeof(int) * len);
for (int i = 0 ; i < len ;++i)
{
num[i] = atoi(str[i]); //把str数组里的元素全部转换为int并存入num数组中
//printf("num[%d] = %d\n", i, num[i]); /* debug*/
}
int max_value = num[0];
int mini_value = num[0];
//得到最大最小值
for(int i = 0; i < len;++i)
{
if (num[i]> max_value)
{
max_value = num[i];
}
else if (num[i] < mini_value)
{
mini_value = num[i];
}
}
int sum = 0;
//得出总值
for(int i = 0; i < len;++i)
{
sum +=num[i];
}
//得出平均值
int average = sum / len;
struct Max_Minni_Aver mma;
mma.m_max = max_value;
mma.m_mini = mini_value;
mma.m_average=average;
return mma;
}
int main(int argc, char *argv[])
{
char str[1024];
char num[10][32];
char *line = NULL;
int i = 0, j = 0;
FILE *p = fopen("c.txt","r");
if (p == NULL)
{
printf("打开文件失败! %s\n",strerror(errno));
return 0;
}
else
{
while ( fgets(str, sizeof(str),p) != NULL) //循环每一行
{
line = str;
while (*line++ != '=') /* get number */
;
while(*line != '\0')
{
if (*line >= '0' && *line <='9')
{
num[i][j] = *line; //找到数字存放到num数组里
j++;
}
line++; //指向字符串下一个元素
}
num[i][j] = 0;
//printf("numlist = %s\n", num[i]); /* debug */
i++;
j = 0;
}
struct Max_Minni_Aver value = calc(num, i); //得到最大值,平均值,最小值
printf("最大值:%d,最小值:%d,平均值:%d\n",value.m_max,value.m_mini,value.m_average);
}
fclose(p);
return 0;
}
问题挺多,建议对比以下上面的代码然后总结一下;
比如:若文件打开失败,那么没必要fclose,所以若打开失败,直接return退出;
再比如每行得到的数字都放在一个num里,那么就是只得到文件最后一行的num;前面的要么被覆盖,要么被破坏;
FILE *p = fopen("c.txt","r");//这里最好是rb,问题也不在这里
问题在这里:
while(*line != '\0')
{
if (*line >= '0' && *line <='9')
{
num[i] = *line; //找到数字存放到num数组里
i++;
//这一句放到循环体外面//line++; //指向字符串下一个元素
}
line++; //指向字符串下一个元素
}
/* 卡住是因为这里,line++应放到判断外 */
if (*line >= '0' && *line <='9')
{
num[i] = *line; //找到数字存放到num数组里
i++;
line++; //指向字符串下一个元素
}
/* 这一步确定没问题吗,还是你就是要算这个,例如str为"123", 你要计算123 + 23 + 3*/
num[i] = atoi(&(str[i]));