2016-04-17 46 views
0
int sales[ 1 ]; 
do 
{ 
    scanf_s("%d", sales, 1); 

    printf("\n%d\n", sales[ 0 ]); 

    printf("\nyou got weekly income of $ %d\n\n", commision(sales[ 0 ])); 

} while (sales[0] >-1); 

我想問,爲什麼我每次輸入INT與空間(例如123 456),輸出是銷售[0] = 123然後突然它會自動分配456銷售[0 ], 你們可以解釋一下爲什麼?輸出突然分開int與空間

回答

1

你的代碼的作用是從標準輸入中讀取一個有符號數。 (%d確實讀取直到空白,但忽略空白本身。)然後它將該數字(第一個數字將爲123)寫入索引0處的sales數組。然後,您將commision(...)函數的返回值寫入標準輸出。

然後突然就自動分配456到銷售[0]

如果你的意思是,在程序的執行結束sales[0]包含456代替123這是因爲整個過程我描述以上操作只要您的do while循環運行。如果銷售[0]大於-1sales[0]123)的情況,則它將再次運行並從標準輸入讀取456,並將其寫入sales陣列。從stdinscanf_s("%d", int_pointer, 1)讀取輸入

一些例子:

  • 輸入42 43ab 44將在3個不同的scanf_s424344讀取。
  • 輸入42 a將被讀入2個不同的scanf_s作爲420
  • 輸入42 a a43 44將被讀入4個不同的scanf_s作爲420044
+0

我看到....但爲什麼規則不適用於字符類型(例如,我輸入ab [空格] d輸出只有銷售=「ab」和[空格]之後的字符串刪除? 和一個更多的事情我仍然感到困惑,編譯器在哪裏存儲456?因爲首先他將123分配給銷售[0],並且沒有剩餘變量用於存儲456 ....在完成第一個循環後,它執行第二個循環( scanf語句),爲什麼scanf突然得到456?從哪裏來的?糾正我,如果我worng –

+0

你是什麼意思「適用於字符類型」?如果你的變量的類型爲'字符'銷售[1]'),你正在做'scanf_s(「%d」,sales,1)''然後'scanf_s'仍然會將輸入解釋爲一個有符號的整數,這意味着只要你發送eg一個空格或換行符輸入將被解析,並且輸入的所有字符形成一個有效的帶符號整數將被「放入」變量(這裏是'sales') - 所有尾隨的將被忽略(輸入'42ab' ='42 '。如果(就像我上面的例子中)'sales'的類型是'char',讀取的整數將是8位而不是32位(大多數是'int's)或64位。 – mxscho

+0

編譯器在這裏什麼都不做。這一切都是在程序運行時發生的,在do'while'scanf_s'的第二次執行中,*替換了'sales [0]'中的值 - 所以'123'被替換爲'456'。 – mxscho

0
int commission(int i) { 
    return 42*i; 
} 

int main(int argc, const char * argv[]) { 
    int sales[ 1 ]; 
    do 
    { 
     scanf_s("%d", sales, 1); 

     printf("\n%d\n", sales[ 0 ]); 

     printf("\nyou got weekly income of $ %d\n\n", commission(sales[ 0 ])); 
     sales[0] = -1; // Won't jump to the next value 
    } while (sales[0] >-1); // But then what's the point of the loop? 

    return 0; 
} 
+0

這是如何回答這個問題的?或者你想在這裏單獨提問,菲利普? – Pang

1

因爲scanf函數是挑剔,它要一個數字的準確輸入。對它來說,空格表示所需輸入格式的結束。

123 [whitespace] - > 123被分配,發生了事情,再次循環。

456 [空格] - > 456被分配,發生的東西,再次循環。