user-0 提问: 小白求教c 用指针数组实现成绩查询和输出学生信息

回复:
user: user-0
content: 引用 12 楼 拥抱Linux 的回复：[quote=引用 11 楼 FAM^刘丽丽 的回复:] 咋给分兄弟 今天第一次发帖 电脑的浏览器里登录csdn论坛，打开自己的帖子，在标题旁边可以看到「结帖」、「给分」等提示框。 具体的 「给分」文本框是出现在每层楼层的回答旁边的。[/quote]ok我尽快

user: user-1
content: 引用 11 楼 FAM^刘丽丽 的回复:咋给分兄弟 今天第一次发帖 电脑的浏览器里登录csdn论坛，打开自己的帖子，在标题旁边可以看到「结帖」、「给分」等提示框。 具体的 「给分」文本框是出现在每层楼层的回答旁边的。

user: user-0
content: 引用 10 楼 拥抱Linux 的回复：[quote=引用 9 楼 FAM^刘丽丽 的回复:] 学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥 不用客气。 如果是数字0开头的学号的话，就没法用 int 类型来保存了，还是应该用字符数组来保存。如果学号位数太长，超出 int 型的取值范围的话， 也需要考虑其它类型来保存 学号 数据，比如使用 long 型 或者 字符数组等。 ～ 如有帮助，欢迎 及时 结帖、给分。：-） ～[/quote]咋给分兄弟 今天第一次发帖

user: user-1
content: 引用 9 楼 FAM^刘丽丽 的回复:学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥 不用客气。 如果是数字0开头的学号的话，就没法用 int 类型来保存了，还是应该用字符数组来保存。如果学号位数太长，超出 int 型的取值范围的话， 也需要考虑其它类型来保存 学号 数据，比如使用 long 型 或者 字符数组等。 ～ 如有帮助，欢迎 及时 结帖、给分。：-） ～

user: user-0
content: 引用 8 楼 拥抱Linux 的回复：[quote=引用 7 楼 FAM^刘丽丽 的回复:] 老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗 （1）根据你的代码，如果名字的字符串本身中间没有空格的话，就没必要去检查空格字符。 你原先用的输入函数是gets，它会把一行输入的所有字符都作为一整个字符串来处理，除非遇到回车。而且在上面的注释里也说了，编译器对gets函数提出了警告，认为它是一个危险函数，容易引起问题，所以俺把所有的gets都给换成了scanf函数。 （2）按你代码的逻辑，输入的时候，第一个for循环只是输入数字啊，应该就是你预想的学号吧？ 然后第二个for循环是只是输入名字啊，名字本身如果内部没有空格的话，直接 scanf("%s",数组名) 是没问题的啊，不同的字符串之间在输入的时候用空格来分隔也没问题。 那就没必要检查什么空格了呀。但是for循环一定要给一个确定的结束条件，所以应该以字符串末尾的结束字符'\0'作为结束条件。 （3）其它楼层有人给出了C自带的库函数<string.h>中的字符串比较函数strncmp，你有兴趣的话可以了解一下、试一试。但是，如果自己能完成字符串的比较的话，对字符串的理解会更有帮助吧。 ～[/quote]学号是那种大学学号哈哈 不过我懂老哥意思了 秒懂 再次谢谢老哥

user: user-1
content: 引用 7 楼 FAM^刘丽丽 的回复:老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗 （1）根据你的代码，如果名字的字符串本身中间没有空格的话，就没必要去检查空格字符。 你原先用的输入函数是gets，它会把一行输入的所有字符都作为一整个字符串来处理，除非遇到回车。而且在上面的注释里也说了，编译器对gets函数提出了警告，认为它是一个危险函数，容易引起问题，所以俺把所有的gets都给换成了scanf函数。 （2）按你代码的逻辑，输入的时候，第一个for循环只是输入数字啊，应该就是你预想的学号吧？ 然后第二个for循环是只是输入名字啊，名字本身如果内部没有空格的话，直接 scanf("%s",数组名) 是没问题的啊，不同的字符串之间在输入的时候用空格来分隔也没问题。 那就没必要检查什么空格了呀。但是for循环一定要给一个确定的结束条件，所以应该以字符串末尾的结束字符'\0'作为结束条件。 （3）其它楼层有人给出了C自带的库函数<string.h>中的字符串比较函数strncmp，你有兴趣的话可以了解一下、试一试。但是，如果自己能完成字符串的比较的话，对字符串的理解会更有帮助吧。 ～

user: user-0
content: 引用 2 楼 拥抱Linux 的回复：简单改了一下：  #include <stdio.h> #include <string.h>  void paixue(int *p1, char *inf[]); void search(char *p1, int *p2, char *inf[]);  int main(void) { 	int i, a[5]; 	char inf1[5][10], *inf[5], name[10]; 	// 把所有的gets函数都换成了scanf函数，编译器提醒使用gets函数比较危险         for (i = 0; i < 5; i++) 		scanf("%d", &a[i]); 	for (i = 0; i < 5; i++) 		scanf("%s",inf1[i]); 	for (i = 0; i < 5; i++) 		inf[i] = inf1[i]; 	paixue(a, inf); 	scanf("%s",name); 	search(name, a, inf); 	return 0; }  void paixue(int *p1, char *inf[]) { 	int i, j, t; 	char *temp; 	for (i = 0; i < 4; i++) 		for (j = i + 1; j < 5; j++) 			if (*(p1 + j) > *(p1 + i)) {                                 // 建议定义一个结构体，交换变量的时候，结构体变量可以直接赋值 				t = *(p1 + i); 				*(p1 + i) = *(p1 + j); 				*(p1 + j) = t; 				temp = inf[i]; 				inf[i] = inf[j]; 				inf[j] = temp; 			} }  void search(char *p1, int *p2, char *inf[]) { 	int i, j, flag = 1; 	for (j = 0; j < 5; j++) {                 // 字符串末尾的结束字符是'\0'，不是空格 		for (i = 0; *(p1 + i) != '\0'; i++) 			if (*(p1 + i) != *(inf[j] + i)) { 				flag = 0; 				break; 			} 		if (flag == 1) { 			printf("%-3d", *(p2 + j)); 			printf("%s\n", inf[j]); 		} 		flag = 1; 	} }  说明都写在注释里了。 ～老哥那个我flag那里的意思是当检测到空格的时候就不进行循环，因为学生的信息要求名字和学号，我输入的时候每输入一个人的名字和学好之间是有空格的，请问这样想有错误吗

user: user-0
content: 引用 1 楼 user-3 的回复：char inf1[5][10],*inf[5],name[10]; for(i=0;i<5;i++) scanf("%d",&a[i]); for(i=0;i<5;i++) gets(inf1[i]); for(i=0;i<5;i++) inf[i]=inf1[i]; paixue(a,inf); gets(name); 这一段代码中没有吃掉回车符，导致你的输入有问题，可与选择使用格式化输入函数谢谢老哥

user: user-0
content: 引用 3 楼 拥抱Linux 的回复：还有比较是否相等的运算符是  ==  不是  = 。 上面忘了提了，但是代码里是修改了的。谢谢老哥 这么明显的错误

user: user-2
content: #include<stdio.h> #include<string.h>      void paixue(int *p1,char *inf[]);     void search(char *p1,int *p2,char *inf[]); void print_info (int *pscore, char *inf[], int n); int main() {     int i,a[5];     char inf1[5][10],*inf[5],name[10];     for(i=0;i<5;i++)         scanf("%d",&a[i]);     getchar();    //for '\n'     for(i=0;i<5;i++)         gets(inf1[i]);     for(i=0;i<5;i++)         inf[i]=inf1[i];     printf("After input: \n");     print_info(a, inf, 5);     paixue(a,inf);     printf("After sort: \n");     print_info(a, inf, 5);     printf("Please input the name: \n");     gets(name);     search(name,a,inf);     return 0; } void paixue(int *p1,char *inf[]) {     int i,j,t;     char *temp;     for(i=0;i<4;i++)         for(j=i+1;j<5;j++)             if(*(p1+j) > *(p1+i))             {                 t=*(p1+i);                 *(p1+i)=*(p1+j);                 *(p1+j)=t;                 temp = inf[i];                 inf[i]=inf[j];                 inf[j]=temp;             } }  void print_info (int *pscore, char *inf[], int n) {     int i;      for (i = 0; i < n; i++) {         printf("%d  ", pscore[i]);         printf("%s\n", inf[i]);     } }  void search(char *p1,int *p2,char *inf[]) {     int i,j,flag=1;     for(j=0;j<5;j++)     {         /*         for(i=0;*(p1+i)!=' ';i++)             if(*(p1+i)!=*(inf[j]+i))             {                 flag=0;                 break;             }         //if(flag=1)         if(flag==1)         {             printf("%-3d",*(p2+j));             printf("%s",inf[j]);         }         flag=1;         */         if (strcmp(p1, inf[j]) == 0) {             printf("%-3d",*(p2+j));             printf("%s\n", inf[j]);         }     } }  供参考！

user: user-1
content: 还有比较是否相等的运算符是  ==  不是  = 。 上面忘了提了，但是代码里是修改了的。

user: user-1
content: 简单改了一下：  #include <stdio.h> #include <string.h>  void paixue(int *p1, char *inf[]); void search(char *p1, int *p2, char *inf[]);  int main(void) { 	int i, a[5]; 	char inf1[5][10], *inf[5], name[10]; 	// 把所有的gets函数都换成了scanf函数，编译器提醒使用gets函数比较危险         for (i = 0; i < 5; i++) 		scanf("%d", &a[i]); 	for (i = 0; i < 5; i++) 		scanf("%s",inf1[i]); 	for (i = 0; i < 5; i++) 		inf[i] = inf1[i]; 	paixue(a, inf); 	scanf("%s",name); 	search(name, a, inf); 	return 0; }  void paixue(int *p1, char *inf[]) { 	int i, j, t; 	char *temp; 	for (i = 0; i < 4; i++) 		for (j = i + 1; j < 5; j++) 			if (*(p1 + j) > *(p1 + i)) {                                 // 建议定义一个结构体，交换变量的时候，结构体变量可以直接赋值 				t = *(p1 + i); 				*(p1 + i) = *(p1 + j); 				*(p1 + j) = t; 				temp = inf[i]; 				inf[i] = inf[j]; 				inf[j] = temp; 			} }  void search(char *p1, int *p2, char *inf[]) { 	int i, j, flag = 1; 	for (j = 0; j < 5; j++) {                 // 字符串末尾的结束字符是'\0'，不是空格 		for (i = 0; *(p1 + i) != '\0'; i++) 			if (*(p1 + i) != *(inf[j] + i)) { 				flag = 0; 				break; 			} 		if (flag == 1) { 			printf("%-3d", *(p2 + j)); 			printf("%s\n", inf[j]); 		} 		flag = 1; 	} }  说明都写在注释里了。 ～

user: user-3
content: char inf1[5][10],*inf[5],name[10]; for(i=0;i<5;i++) scanf("%d",&a[i]); for(i=0;i<5;i++) gets(inf1[i]); for(i=0;i<5;i++) inf[i]=inf1[i]; paixue(a,inf); gets(name); 这一段代码中没有吃掉回车符，导致你的输入有问题，可与选择使用格式化输入函数