user-0 提问: c语言中，打印数组的第1个name值无法显示

回复:
user: user-0
content: 引用 楼主 xxchaohu 的回复:/*  * 读入身高和体重，计算并按身高由大到小显示  */  #include <stdio.h> #include <string.h>  typedef struct {     char    name[100];     double  height;     double  weight; } student;  void swap(student *x, student *y) {     student temp = *x;     *x = *y;     *y = temp; }  /*--- 对数组data的前n个元素按身主进行升序排列 ---*/ void sort(student data[], int n) {     int k = n -1;     while (k >= 0) {         int i, j;         for(i = 1, j = -1; i <= k; i++) {             if(data[i-1].height > data[i].height) {                 j = i - 1;                 swap(&data[i], &data[j]);             }         k = j;         }     } } int main(void) {     FILE    *fp;     int     ninzu = 0;  /* 人数 */     char    name[100];  /* 姓名 */     double  height, weight;  /*身高、体重*/      if((fp = fopen("hw.dat", "r")) == NULL)         printf("\a文件打开失败。\n");     else {         int i;         student std[] = {};         while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3) {             strcpy(std[ninzu].name, name);             std[ninzu].height = height;             std[ninzu].weight = weight;             printf("std[%d].name=%s\n", ninzu, std[ninzu].name);  /*测试打印name值，可以正常显示*/             ninzu++;         }          sort(std, ninzu);  /* 排序也不正确*/          printf("std[%d].name=%s\n", 0, std[0].name); /*为空*/         for( i = 0; i < ninzu; i++)             printf("%-10s %5.1f %5.1f\n", std[i].name, std[i].height, std[i].weight);  /*第一个std[0].name无法显示*/         printf("---------------------\n");         fclose(fp);      }      return (0); }   显示结果为：  std[0].name=Aiba std[1].name=Kurata std[2].name=Masaki std[3].name=Tanaka std[4].name=Tsuji std[5].name=washio std[0].name=            160.0  59.3 Kurata     162.0  51.6 Masaki     182.0  76.5 Tanaka     170.0  60.7 Tsuji      175.0  83.9 washio     175.0  72.5   hw.dat文件的内容为  Aiba    160 59.3 Kurata  162 51.6 Masaki  182 76.5 Tanaka  170 60.7 Tsuji   175 83.9 washio  175 72.5   49		if((fp = fopen("hw.dat", "r")) == NULL) (gdb)  54			while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3) { (gdb)  55				strcpy(std[ninzu].name, name); (gdb)  56				std[ninzu].height = height; (gdb)  57				std[ninzu].weight = weight; (gdb)  59				ninzu++; (gdb) i locals i = 0 std = 0x7fffffffe440 fp = 0x601010 ninzu = 0 name = "Aiba\000\000\000\000\236\344\377\377\377\177\000\000\237\344\377\377\377\177\000\000\001", '\000' <repeats 15 times>"\235, \a\351\364\062", '\000' <repeats 11 times>"\340, \n@", '\000' <repeats 13 times>"\343, \004@\000\000\000\000\000\330\345\377\377\377\177\000\000\000\000\000\000\000\000d@Aiba" height = 160 weight = 59.296886609127348  strcpy之后是可以显示的，我将排序注释掉之后，还是出现这个问题，所以不是排序导致的，我想是不是strcpy，但strcpy之后是可以打印出来的，难道打印出来之后就不见了？

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

user: user-0
content: 排序问题也解决了，谢谢大家！

user: user-0
content: 引用 7 楼 xxchaohu 的回复:[quote=引用 3 楼 jianwen0529 的回复:] swap使用深度拷贝  你这个swap根本就是错误的，你对栈上的对象赋予指针，不可能修改掉  你的数据本身就是排序好的，看起来像是那么一回事。你换下不是排序的数据测试，你结果完全没有变化  不是排序的问题，排序注释掉，仍然是这个结果[/quote]  谢谢，果然按照你做的就好了

user: user-2
content: student std[] = {};应该错在这里。这是什么用法，变长数组也需要指定长度？ 我改成 #define MAX 10  student std[MAX] = {}后就没问题了

user: user-0
content: 引用 3 楼 jianwen0529 的回复:swap使用深度拷贝  你这个swap根本就是错误的，你对栈上的对象赋予指针，不可能修改掉  你的数据本身就是排序好的，看起来像是那么一回事。你换下不是排序的数据测试，你结果完全没有变化  不是排序的问题，排序注释掉，仍然是这个结果

user: user-0
content: 引用 4 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 (gdb) n 49		if((fp = fopen("hw.dat", "r")) == NULL) (gdb)  54			while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3) { (gdb)  55				strcpy(std[ninzu].name, name); (gdb)  56				std[ninzu].height = height; (gdb)  57				std[ninzu].weight = weight; (gdb)  59				ninzu++; (gdb) i locals i = 0 std = 0x7fffffffe440 fp = 0x601010 ninzu = 0 name = "Aiba\000\000\000\000\236\344\377\377\377\177\000\000\237\344\377\377\377\177\000\000\001", '\000' <repeats 15 times>"\235, \a\351\364\062", '\000' <repeats 11 times>"\340, \n@", '\000' <repeats 13 times>"\343, \004@\000\000\000\000\000\330\345\377\377\377\177\000\000\000\000\000\000\000\000d@Aiba" height = 160 weight = 59.296886609127348  从while循环出来之后就无法打印str[0].name了，还请版主提示下这时怎么调试

user: user-3
content: swap使用深度拷贝  你这个swap根本就是错误的，你对栈上的对象赋予指针，不可能修改掉  你的数据本身就是排序好的，看起来像是那么一回事。你换下不是排序的数据测试，你结果完全没有变化

user: user-2
content: 改用qsort 吧 int cmp_height(void const *left, void const *right) { 	student *pleft = (student *)left; 	student *pright = (student *)right; 	if (pleft->height > pright->height) return -1; 	else if (pleft->height == pright->height) return 0; 	else return 1; } #include <stdlib.h>  int main() { //.....   qsort(stu, ninzu, sizeof(stu), cmp_height);  //...  }

user: user-2
content: 是你写的sort函数不对导致后面第1个name无法显示