user-0 提问: 在Linux下写了一段读写操作的程序，运行卡住，gdb调试也无反应

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 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；前面的要么被覆盖，要么被破坏；感谢热心回答！

user: user-0
content: 引用 3楼heronism 的回复:               /*  卡住是因为这里，line++应放到判断外 */              if (*line >= '0' && *line <='9')                 {                     num[i] = *line;    //找到数字存放到num数组里                     i++;                     line++;    //指向字符串下一个元素                 }      /* 这一步确定没问题吗，还是你就是要算这个，例如str为"123"， 你要计算123 + 23 + 3*/  num[i] = atoi(&(str[i]));

user: user-2
content: #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；前面的要么被覆盖，要么被破坏；

user: user-3
content: 来晚了，你自己已经解决了，我就再说说吧。    FILE *p = fopen("c.txt","r");//这里最好是rb，问题也不在这里   问题在这里：              while(*line != '\0')             {                 if (*line >= '0' && *line <='9')                 {                     num[i] = *line;    //找到数字存放到num数组里                     i++;                     //这一句放到循环体外面//line++;    //指向字符串下一个元素                 }                     line++;    //指向字符串下一个元素             }

user: user-4
content: /*  卡住是因为这里，line++应放到判断外 */              if (*line >= '0' && *line <='9')                 {                     num[i] = *line;    //找到数字存放到num数组里                     i++;                     line++;    //指向字符串下一个元素                 }      /* 这一步确定没问题吗，还是你就是要算这个，例如str为"123"， 你要计算123 + 23 + 3*/  num[i] = atoi(&(str[i]));

user: user-5
content: 自己能发现问题，赞！

user: user-0
content: 额，已经发现问题了。