我从用户输入几个数字,将它们存储到一个文件中,然后从该文件中读取,对数字进行排序并将其显示给用户。除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;
}
答案 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
(在第二次调用中)。事情应该更像你期待的那样。
格式字符串由一系列指令组成,这些指令描述了如何处理输入字符序列......指令是以下之一:一系列空白字符(空格,制表符,换行符等;见isspace(3))。该指令在输入中匹配任意数量的空格,包括无空格。
因此循环scanf
(其中包含额外的\n
)有效地读取数字,换行符,下一个数字,然后意识到它可以读取所有可能的空白区域。然后返回scanf
,其中第一个数字分配给您的数组条目,下一个数字准备好下次调用标准输入。这使得有效偏移的东西看起来就像你看到的那样,并且在结束之前需要额外的数字(以便它可以检测到空白区已经结束)。