我必须做一个C语言中的学校分配小程序,它将读取标准输入并打印一些标准输出。更具体地说,它是关于读取数字并对它们进行排序。
(你可以跳过这个,它只是为了理解代码) 输入的第一行应确定将有多少行数。第二行是下一行中的数字。第三行是具体数字。第四行是下一行中的数字的数量,依此类推,直到达到K行数。限制为0&lt; K <= 10(最多10个序列),每个序列可包含最多10.000.000个数字,每个数字的值最大为10.000.000
示例 输入:
Ouptup:
0 5 5 45 22131 99912 521313 7988956 9489498
所以我做了一个工作程序,但似乎不稳定,值越高。但是,我无法确定程序何时何地失败。在我的计算机上,我测试了所有可能的最大值,并在合理的时间内返回了正确的输出,但在完成测试的学校服务器上,它无法处理高值并失败。
有一件事,程序应该只使用C,而不是C ++,但我不太确定它们之间的差异,因为我使用的是C ++编译器,我的代码可能不仅仅是原始的C. / p>
我是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;
}
答案 0 :(得分:0)
根据您提供的信息,我认为这只是服务器上的资源限制。服务器内存不足,malloc()
失败。我建议您调试或执行此操作:
if(numbers == NULL){
printf("malloc() failed\n");
exit(1);
}
答案 1 :(得分:0)
打印初始零的代码是可疑的:
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 ");
}
}
假设你有一个序列,其中0为最后一个元素(例如1 2 3 4 5 0);我想这段代码只打印0
,后面没有空格,后续代码会打印1 2 3 4 5
,所以你会得到类似01 2 3 4 5
的内容。
我知道你希望输出尽可能美观,也就是说,最后没有空格。另请注意,输出结尾处的换行符(\n
)可能不错。
答案 2 :(得分:-1)
我重写了程序的开头部分,以帮助您走上正确的道路。这应该可以帮到你,但我不能确定,因为我真的不知道是什么导致程序崩溃。
这实现了realloc
函数,它可以使您的程序比现在更加高效。如果你不知道realloc
是什么,你可以阅读here和here。
#include <stdio.h>
#include <stdlib.h>
#define BUFFER 256 //for memory management
int main(void)
{
int k, n, i, y , x, index = 0, bff; //declare integer 'bff' and set it to BUFFER
int *numbers = NULL, *tmp; //declare a pointer (numbers) for allocated memory, and a pointer (tmp) for the realloc function
if(!(numbers = malloc(BUFFER * sizeof(int)))) //allocate space for 'bff' integers
{
exit(1); //allocation failed
}
scanf("%d", &k);
for (x = 0; x < k; x++)
{
scanf("%d", &n);
while(scanf("%d", &i) > 0)
{
if(bff <= index) //if the size of index grows larger than the amount of space we allocated
{
bff += BUFFER; //increase the size of bff by BUFFER
if(!(tmp = realloc(numbers, bff * sizeof(int)))) //resize our allocated memory block using the tmp pointer
{
free(numbers); //allocation failed so free already allocated memory
exit(1); //and terminate the program
}
numbers = tmp; //make numbers point to the same location as tmp
numbers[index++] = i;
if(++y == n) break;
}
}
}
.
.
.
free(numbers);
return 0;
}
请记住,有更有效的方法来使用realloc。我刚刚在这里发布,以帮助您走上正轨。祝你好运!
答案 3 :(得分:-1)
您正在分配错误的内存量。规范声明每个序列可以包含1000万个值,而您分配固定数量。输入值可能高达 k * 1000万,您无法知道分配的金额是否足够。
正如m0skit0所指出的,问题也可能是由于过度分配。
要解决这个问题,你应该分配所需的内存量,不多也不少。
使用为每个序列提供的序列长度来完成该操作。
此外,您需要检查malloc
和realloc
的返回值。如果返回值为NULL
,则分配失败,您应该打印错误消息并exit
。