user-0 提问: 数组

回复:
user: user-0
content: 引用 3 楼 汉森伯逸的回复:楼主是不是想利用动态内存自由定义数组，我这有个很简单的方法要的话中午给你写 对呀，怎么弄呀

user: user-1
content: for(int i=0;i<count;i++) { if(A[i]==m) { num=i; } break; } 这个break应该放到if语句块里。而不是放在外面

user: user-2
content: 楼主是不是想利用动态内存自由定义数组，我这有个很简单的方法要的话中午给你写

user: user-3
content: 、

user: user-4
content: MSDN中关于scanf()的返回值有如下描述 Returns the number of fields successfully converted and assigned. A return value of 0 indicates that no fields were assigned. scanf()函数的返回值是读入数据的个数。在你的代码中， while (scanf("%d", &a)== 1) 每次读入的数据个数都是1，scanf()函数的返回值一直是1，条件语句始终成立，所以while()会一直循环下去，没有向下执行。

user: user-5
content: int getBuff; while ((getBuff = getchar() != '\n') && (getBuff != EOF));  使用scanf之后，往往输入缓冲区有残留数据，可以是回车符，也可以是其它没有被之前的scanf吸收的任何的输入数据。 后面如果有scanf的话，这个scanf首先是去查看输入缓冲区有没有数据，如果有的话，它就直接取来用了，就不会等待外来的输入了。  你最上面的代码的问题原因，一方面是没有清空输入缓冲区，另一方面，最重要的，逻辑上的问题，还是那个 break; 语句的位置不对。

user: user-0
content: 引用 6 楼 儿童节的回复:2楼、4楼说得对，关键是 break; 放错位置了，应该放在 if 的代码块内部。   #include <stdio.h> #include <malloc.h>  int main() { 	int *A; 	// 编译的时候，提示warning，变量x没有用到。。。 	//	int a, h, m, x, y, z, num, count, i = 0; 	int a, h, m, y, z, num, count, i = 0; 	printf("输入数组元素:\n"); 	/* 昨天在你的另一个帖子里说过，malloc应适当地多申请一点内存空间，否则放不下多少数据。         *   另外，仅仅针对int型数组而言，用malloc来申请内存空间真的是没有节约空间，反而浪费了。         *   具体见我之前的一篇总结文章：https://blog.csdn.net/weixin_44732817/article/details/88566962         *   还不如直接定义A为一个int数组，长度定个20、50之类的，在不济就定个1000。         *   真要动态申请内存空间的话，至少要考虑用多个指针把多个内存空间相互联系起来才行。         *   不过，仅仅对于一个int数据，就去malloc一下，真的是严重浪费。         */  	// 修改：申请了20 个 int 型数据的内存空间 	A = (int *)malloc(20 * sizeof(int)); 	while (scanf("%d", &a) == 1) { 		A[i] = a; 		i++; 		count = i; 	} 	printf("数组的长度:%d\n", count); 	printf("数组的元素为:"); 	for (i = 0; i < count; i++) { 		printf("% d", A[i]); 	} 	printf("\n"); //  为了让输出结果看起来顺眼，加一个换行符  	// 下面两句，吸收前面使用scanf之后的输入缓冲区残留数据 	int getBuff; 	while ((getBuff = getchar() != '\n') && (getBuff != EOF)) 		;  	printf("请输入查找的数:\n"); 	scanf("%d", &m);  	num = -1; //  增加一句，初始化num变量，且初值不在A[]的下标范围内，以防后面使用未初始化过的值  	for (int i = 0; i < count; i++) { 		if (A[i] == m) { 			num = i; 			break; // 修改后 		} 		// 这个 break; 应该放进 if 的代码块内部，否则，for 循环的第一次循环执行到这里就结束循环了 		//		break; 	}  	//  在数组A[]中有匹配的数的情况下，num的值为相应的下标值，没有匹配的话，仍为-1 	if (num < count && num != -1) { 		for (y = num; y < count - 1; y++) { 			A[y] = A[y + 1]; 			//  为什么要count--;呢？ 不是已经y++了吗？这句多余了！ 			//			count--; 		}  		printf("删除后的数组为：\n"); 		for (int i = 0; i < count - 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了。 			// A[y]又是什么鬼？？？ 			//			printf("删除后的数组为:%d\n", A[y]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} else { 		// 下面这块的意思，没弄明白。为什么要把m插入到A[]数组的中间去呢？ 		//  删除了原来的int，count / 2 运算是取商，本来就是 int 型啊！ 		z = count / 2; 		// 循环条件有问题：h 的初始值是count，那么它怎么会小于 z 呢？？？循环执行不了啊！ 		//		for (h = count; h < z; h--) { 		for (h = count; h > z; h--) { 			//  理论上来说，下标h已经越界了。当然了，前面定义了足够大的数组长度就没关系吧。 			A[h] = A[h - 1]; 		} 		A[z] = m;  		printf("插入后的数组为：\n"); 		for (int i = 0; i < count + 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了 			//			printf("插入后的数组为:%d", A[i]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} 	free(A); 	A = NULL; 	return 0; }   Linux环境gcc编译测试截图：   另，常见的动态申请一维数组的空间的方法，也是需要你先给出一个数组长度值，然后才去malloc申请，而不是输入一个数，就去malloc一次。建议不要太纠结在一维数组的动态申请上，动态链表等等之类的情况才比较适用一个节点malloc一次的方式。 再次感谢你的解答，谢谢。 我还有问题想问一下你 int getBuff; while ((getBuff = getchar() != '\n') && (getBuff != EOF)); 这一句是吸收我从键盘上输入的回车吗？我觉得没有执行之后的语句就是因为执行程序的时候敲了回车键。

user: user-5
content: 2楼、4楼说得对，关键是 break; 放错位置了，应该放在 if 的代码块内部。   #include <stdio.h> #include <malloc.h>  int main() { 	int *A; 	// 编译的时候，提示warning，变量x没有用到。。。 	//	int a, h, m, x, y, z, num, count, i = 0; 	int a, h, m, y, z, num, count, i = 0; 	printf("输入数组元素:\n"); 	/* 昨天在你的另一个帖子里说过，malloc应适当地多申请一点内存空间，否则放不下多少数据。         *   另外，仅仅针对int型数组而言，用malloc来申请内存空间真的是没有节约空间，反而浪费了。         *   具体见我之前的一篇总结文章：https://blog.csdn.net/weixin_44732817/article/details/88566962         *   还不如直接定义A为一个int数组，长度定个20、50之类的，在不济就定个1000。         *   真要动态申请内存空间的话，至少要考虑用多个指针把多个内存空间相互联系起来才行。         *   不过，仅仅对于一个int数据，就去malloc一下，真的是严重浪费。         */  	// 修改：申请了20 个 int 型数据的内存空间 	A = (int *)malloc(20 * sizeof(int)); 	while (scanf("%d", &a) == 1) { 		A[i] = a; 		i++; 		count = i; 	} 	printf("数组的长度:%d\n", count); 	printf("数组的元素为:"); 	for (i = 0; i < count; i++) { 		printf("% d", A[i]); 	} 	printf("\n"); //  为了让输出结果看起来顺眼，加一个换行符  	// 下面两句，吸收前面使用scanf之后的输入缓冲区残留数据 	int getBuff; 	while ((getBuff = getchar() != '\n') && (getBuff != EOF)) 		;  	printf("请输入查找的数:\n"); 	scanf("%d", &m);  	num = -1; //  增加一句，初始化num变量，且初值不在A[]的下标范围内，以防后面使用未初始化过的值  	for (int i = 0; i < count; i++) { 		if (A[i] == m) { 			num = i; 			break; // 修改后 		} 		// 这个 break; 应该放进 if 的代码块内部，否则，for 循环的第一次循环执行到这里就结束循环了 		//		break; 	}  	//  在数组A[]中有匹配的数的情况下，num的值为相应的下标值，没有匹配的话，仍为-1 	if (num < count && num != -1) { 		for (y = num; y < count - 1; y++) { 			A[y] = A[y + 1]; 			//  为什么要count--;呢？ 不是已经y++了吗？这句多余了！ 			//			count--; 		}  		printf("删除后的数组为：\n"); 		for (int i = 0; i < count - 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了。 			// A[y]又是什么鬼？？？ 			//			printf("删除后的数组为:%d\n", A[y]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} else { 		// 下面这块的意思，没弄明白。为什么要把m插入到A[]数组的中间去呢？ 		//  删除了原来的int，count / 2 运算是取商，本来就是 int 型啊！ 		z = count / 2; 		// 循环条件有问题：h 的初始值是count，那么它怎么会小于 z 呢？？？循环执行不了啊！ 		//		for (h = count; h < z; h--) { 		for (h = count; h > z; h--) { 			//  理论上来说，下标h已经越界了。当然了，前面定义了足够大的数组长度就没关系吧。 			A[h] = A[h - 1]; 		} 		A[z] = m;  		printf("插入后的数组为：\n"); 		for (int i = 0; i < count + 1; i++) { 			// 文字"插入后的数组为："就不用放到循环里来了 			//			printf("插入后的数组为:%d", A[i]); 			printf("%d ", A[i]); 		} 		printf("\n"); // 最后加个换行符，美观一点点。。。 	} 	free(A); 	A = NULL; 	return 0; }   Linux环境gcc编译测试截图：   另，常见的动态申请一维数组的空间的方法，也是需要你先给出一个数组长度值，然后才去malloc申请，而不是输入一个数，就去malloc一次。建议不要太纠结在一维数组的动态申请上，动态链表等等之类的情况才比较适用一个节点malloc一次的方式。