【发布时间】:2023-03-30 09:09:01
【问题描述】:
我必须做一个 C 语言的学校作业小程序,它将读取标准输入并打印一些标准输出。更具体地说,它是关于读取数字并对其进行排序。
(可以跳过,只是为了理解代码) 输入的第一行应确定将有多少行数字。第二行是下一行数字的数量。第三行是具体数字。第四行是下一行的数字数量,依此类推,直到达到 K 行。限制为 0
示例 输入:
- 2 //表示将有2个数字序列(行)及其对应的数量
- 3 //第一个序列会有3个数字
- 5 99912 45 //第一个序列
- 6 //在第二个序列中会有6个数字
- 9489498 22131 0 521313 7988956 5 //第二个序列
输出:
0 5 5 45 22131 99912 521313 7988956 9489498
所以我已经完成了一个工作程序,但它似乎不稳定,具有更高的值。但是我无法确定程序究竟何时何地失败。在我的电脑上,我测试了所有可能的最大值,并在合理的时间内返回了正确的输出,但在完成测试的学校服务器上,它无法处理高值并失败。
有一件事,程序应该只使用 C,而不是 C++,但我不太确定它们之间的差异,而且由于我使用的是 C++ 编译器,所以我的代码可能不仅仅是原始 C。
我是一个 C 初学者,这对我来说就像“Hello world”,所以请你快速浏览一下代码并说出可能导致不稳定的原因吗?谢谢
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int k, n, i, y, x, index = 0;
int *numbers = (int*) malloc(100000000 * sizeof(int));
if(numbers == NULL){
exit(1);
}
scanf("%d", &k);
for (x = 0; x < k; x++) {
y = 0;
scanf("%d", &n);
while(scanf("%d", &i) > 0){
numbers[index++] = i;
if(++y == n){
break;
}
}
}
for(y = 0;y < index;y++){ //find and print all 0's, because later I will use 0 as a
//already used (printed) element in array and ignore it
if(numbers[y] == 0){
if(y == index-1){
printf("0");
}else{
printf("0 ");
}
}
}
int smallest, smallestIndex;
for(x = 0;x < index;x++){ //print all other numbers in ascending order
smallest = 0;
for(y = 0;y < index;y++){ //find current smallest number
if((numbers[y] < smallest || smallest == 0) && numbers[y] != 0){
smallest = numbers[y];
smallestIndex = y;
}
}
numbers[smallestIndex] = 0;
if(smallest > 0){
if(x == index-1){
printf("%d", smallest);
}else{
printf("%d ", smallest);
}
}
}
free(numbers);
numbers = NULL;
return 0;
}
【问题讨论】:
-
快速浏览后,您似乎只使用了 C 而不是
//cmets。 C 的当前版本现在可能支持这一点,我不确定。 -
另外,你能告诉我们更多关于你的学校服务器发生故障的细节吗?您收到错误消息吗?如果是这样,请将其复制并粘贴到此处,以便我们帮助您找出解决方案。
-
您不需要预先分配那么多内存。搜索
realloc函数。 -
我无法获得有关崩溃原因的更多信息,服务器的测试工具只返回测试了哪些值以及使用这些值的测试是否成功。我会试试 realloc 函数
-
也许崩溃的是测试工具。