在Linux下写了一段读写操作的程序,运行卡住,gdb调试也无反应

Cyshall 2017-11-27 08:25:21
在Linux下写了一段读写操作的程序,运行卡住,gdb调试也无反应!


下面就是小弟写的辣鸡代码,还请各位大神帮忙看看,如有任何回答感激不尽!
-------------------------------------------------------------------------------------------------------------------------------------------------
#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;
}


c.txt文件内容如下:
index1 = 45
index2 = 36
index3 = 231
index4 = 43
index5 = 100
index6 = 123
index7 = 51
...全文
680 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-12
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
Cyshall 2017-12-12
  • 打赏
  • 举报
回复
引用 5楼自信男孩 的回复:
#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;前面的要么被覆盖,要么被破坏;
感谢热心回答!
Cyshall 2017-12-12
  • 打赏
  • 举报
回复
引用 3楼heronism 的回复:
   
           /*  卡住是因为这里,line++应放到判断外 */
             if (*line >= '0' && *line <='9')
                {
                    num[i] = *line;    //找到数字存放到num数组里
                    i++;
                    line++;    //指向字符串下一个元素
                }
   
/* 这一步确定没问题吗,还是你就是要算这个,例如str为"123", 你要计算123 + 23 + 3*/
 num[i] = atoi(&(str[i]));
自信男孩 2017-11-28
  • 打赏
  • 举报
回复
#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++;    //指向字符串下一个元素
            }
heronism 2017-11-28
  • 打赏
  • 举报
回复
   
           /*  卡住是因为这里,line++应放到判断外 */
             if (*line >= '0' && *line <='9')
                {
                    num[i] = *line;    //找到数字存放到num数组里
                    i++;
                    line++;    //指向字符串下一个元素
                }
   
/* 这一步确定没问题吗,还是你就是要算这个,例如str为"123", 你要计算123 + 23 + 3*/
 num[i] = atoi(&(str[i]));
老马何以识途 2017-11-28
  • 打赏
  • 举报
回复
自己能发现问题,赞!
Cyshall 2017-11-27
  • 打赏
  • 举报
回复
额,已经发现问题了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧