2016-09-27 233 views
-5
if (answer == 'Y') { 

    int a, u, l; 
    printf("How many numbers do you need?\n"); 
    scanf("%d", a); 

程序在此行後崩潰。我應該用什麼來代替「%d」?格式'%d'需要'int *'類型的參數,但參數的類型爲'int'

printf("Specify the lower bound of the range:"); 
    scanf("%d", l); 

    printf("Specify the upper bound of the range:"); 
    scanf("%d", u); 

    for(c = 1;c <= a ;c++) { 
     n = rand() %(u - l) + 1; 
     printf("%d\n", n); 
    } 

} 
+0

上使用'scanf的任何C教程()'應該解釋清楚。 – Barmar

回答

2

你需要通過變量的地址,因爲scanf()將值存儲在它。

該程序崩潰,因爲scanf()取消引用int這是甚至還沒有初始化這兩個事情導致未定義的行爲。

其實,這些都是不確定的行爲,所有發生在單一scanf()呼叫

  1. 訪問一個空指針
  2. 傳遞不正確的類型給定的格式說明。
  3. 從初始化的變量讀。

要通過地址使用操作

if (scanf("%d", &a) == 1) { 
    // Proceed with `a' and use it 
} else { 
    // Bad input, do not use `a' 
} 

&地址在這種情況下,該警告是不是一個錯誤,因爲int原則上轉換爲指針,但如果你的行爲是不確定的嘗試引用此類型,並且指針大小可能太大而不能存儲int

這個警告是非常嚴重的,忽略它不會產生良好的行爲,因爲它涉及到治療值,是不太可能,如果它是一個指針值,這通常會導致程序崩潰。

一般而言,如果您知道自己在做什麼,只應忽略警告。而且幾乎從不,你會有目的地引發警告,儘管在某些情況下它可能是合法的。

作爲一個初學者(我知道你只是一個初學者,因爲你正在使用scanf()),你一定不能忽略警告。

而且,即使你的課本例子從來不檢查的scanf()你應該返回值。不這樣做,特別是當你還沒有初始化變量,但可能會調用未定義的行爲。

3
scanf("%d", &a); 

scanf()需要作爲參數他可以存儲信息的地址。

a是變量的名稱,而&a是包含該變量的內存地址。如下圖所示在scanf可變的

0

通行證地址:

if (answer == 'Y') { 
    int a, u, l; 

    printf("How many numbers do you need?\n"); 
    scanf("%d", &a); 

    printf("Specify the lower bound of the range:"); 
    scanf("%d", &l); 

    printf("Specify the upper bound of the range:"); 
    scanf("%d", &u); 

    for(int c = 1;c <= a ;c++) { 
     n = rand() %(u - l) + l; 
     printf("%d\n", n); 
    } 

} 
相關問題