2017-03-06 16 views
-4

我將幾個數字作爲用戶的輸入,將它們存儲到一個文件中,然後從該文件讀取數據,對數字進行排序並將其顯示給用戶。該程序的作品除1個問題。當從用戶那裏得到輸入時,它要求額外的元素超過指定的限制。這個額外的元素不會被存儲在任何地方。我曾嘗試將極限值減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

人們低調,請你提供一個理由。它會幫助我製作未來的帖子。謝謝。 – Ghos3t

回答

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

應該是:

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

如果你問它忽略號碼後的空白,它將不得不繼續讀直到讀到一些非空白的爲了確保它忽略了所有的空格。您絕對不希望scanf在讀取數字後嘗試忽略空格,您希望它終止。

%d格式說明符在數字之前已經忽略了空格。

+0

在*'%d'之前,您不需要它*。它被指定忽略空白字符。然而,你在'%c'之前確實需要它。 – StoryTeller

+0

@StoryTeller謝謝。固定。 –

0

我們只是縮小下來到下面的代碼:

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

請注意,在scanf電話有什麼區別?第一個調用的格式字符串中沒有\n。第二個電話確實如此。

scanf格式字符串中刪除\n(在第二次調用中)。事情應該更像你期待的那樣。

在線manual page for scanf說:

格式字符串由它描述如何處理輸入字符序列...一個指令是以下的一個指令序列:塗白的序列空格字符(空格,製表符,換行符等;參見isspace(3))。該指令匹配輸入中的任意數量的空白,包括無。

於是繞在scanf(與它額外的\n)的有效讀取次數,換行,下一個數字,然後實現它的讀取所有的空格它可能的。然後返回scanf,第一個數字分配給您的數組條目,下一個數字準備下一次從標準輸入讀取。這會使事情有效抵消,就像你看到的一樣,並且在結束之前需要額外的數字(以便它可以檢測到空白結束)。