在进行用户输入时,数组超出限制

时间:2017-03-06 08:18:54

标签: c arrays

我从用户输入几个数字,将它们存储到一个文件中,然后从该文件中读取,对数字进行排序并将其显示给用户。除1个问题外,该计划有效。当从用户那里获取输入时,它要求额外的元素超过指定的限制。这个额外的元素不会存储在任何地方。我已经尝试将限制值减少一个但是会导致丢失1个元素(即1个元素变为0)。我知道这可能是一个非常新手的问题,但我没有找到任何直接的答案来解决这个问题。我在Visual Studio 2010中将程序编写为C程序。这是代码:

#include <stdio.h>
int arr[50];
int n;

int writefile()
{

FILE *ptr;
ptr = fopen("Sort.txt","w");

    if(ptr==NULL)
    {
        printf("No such file exists\n");
        fclose(ptr);
        return 0;
    }
    else
    {

        int i;
        printf("Enter number of elements in array\n");
        scanf("%d", &n);
        printf("Enter %d elements\n", n);

        for(i=0; i<n; i++) //The issue is here
        {
            scanf("%d\n",&arr[i]); //say the user enter n=3, then after adding 1,2,3 it will ask for another 4th element but only 1,2,3 will get stored.
        }

        fwrite(arr, sizeof(int), n, ptr);

        fclose(ptr);
        printf("done\n");
    }
}

void sortarr(int arr1[]);


int readfile()
{
    FILE *ptr;
    ptr = fopen("Sort.txt","r");

    if(ptr==NULL)
    {
        printf("No such file exists\n");
        fclose(ptr);
        return 0;
    }
    else
    {
        int i;
        int arrb[50];

        fread(arrb, sizeof(int), n, ptr);

        printf("Before sorting data\n");
        for(i=0; i<n; i++)
        {
            printf("%d",arrb[i]);
        }
        printf("\n");

        sortarr(arrb);

        printf("After Sorting data\n");

        for(i=0; i<n; i++)
        {
            printf("%d",arrb[i]);
        }
        printf("\n");
    }
}

void sortarr(int arr1[])
{
    int i,j,temp;
    for (i = 0; i < n; i++) {
        for (j = i + 1; j < n; j++) {
            if (arr1[i] > arr1[j]) {
                temp = arr1[i];
                arr1[i] = arr1[j];
                arr1[j] = temp;
            }
        }
    }
}


int main()
{
    writefile();
    readfile();
    return 0;
}

2 个答案:

答案 0 :(得分:3)

        scanf("%d\n",&arr[i]);

应该是:

        scanf("%d",&arr[i]);

如果你要求它忽略数字之后的空格,它必须继续读取,直到它读取一些非空格,以确保它忽略了所有的空格。您绝对不希望scanf在读取数字后尝试忽略空格,您希望它终止。

%d格式说明符已经忽略了数字之前的空格。

答案 1 :(得分:1)

让我们将其缩小到以下代码:

scanf("%d", &n);
for (i = 0; i < n; i++)
{
    scanf("%d\n", &arr[i]);
}

请注意scanf来电的区别?第一个调用的格式字符串中没有\n。第二个电话会。

\n格式字符串中删除scanf(在第二次调用中)。事情应该更像你期待的那样。

在线manual page for scanf说:

  

格式字符串由一系列指令组成,这些指令描述了如何处理输入字符序列......指令是以下之一:一系列空白字符(空格,制表符,换行符等;见isspace(3))。该指令在输入中匹配任意数量的空格,包括无空格。

因此循环scanf(其中包含额外的\n)有效地读取数字,换行符,下一个数字,然后意识到它可以读取所有可能的空白区域。然后返回scanf,其中第一个数字分配给您的数组条目,下一个数字准备好下次调用标准输入。这使得有效偏移的东西看起来就像你看到的那样,并且在结束之前需要额外的数字(以便它可以检测到空白区已经结束)。