2016-01-16 58 views
-1

這是我的代碼,我仍然保持在找什麼是錯的,我是一個初學者,我想了解:我的代碼有什麼問題,我期望在int中打印輸出,但它似乎不是?

#include<stdio.h> 
int main() 
{ 
    int a; 

    printf("Input: "); 
    scanf("%d", &a); 
    printf("\n%d", &a); 
    a+=2; 
    printf("\n%d", &a); 
    a+=4; 
    printf("\n%d", &a); 
    a+=2; 
    printf("\n%d", &a); 
    return 0; 
} 

這裏是輸出:

Input: 10 

-1078169908 
-1078169908 
-1078169908 
-1078169908 
+0

你不需要'&'爲整數 – Arc676

+1

打印@ Arc676只有scanf函數失敗。 –

+0

以換行符爲前綴格式化字符串也很奇怪。通常情況下,人們會把它們放在格式字符串的末尾。 –

回答

6

你不需要將a的地址傳遞給printf()以打印內容。

變化

printf("\n%d", &a); 

printf("\n%d", a); 

此外,你應該檢查的scanf()返回值。如果scanf()失敗,您將通過訪問單位化局部變量調用undefined behavior

也就是說,int main()至少應該是int main(void)以符合標準。

+0

啊好吧謝謝。 – jack1

+1

加上一個未定義的行爲。 –

+1

@Ehsan Don;那樣說。聽起來答案本身就是UB。乾杯;) –

3

只是一些點添加到別人的答案:

&運營商給出的變量

的地址,所以當你說:

scanf("%d",&a); 

你居然告訴編譯器將變量a的地址傳遞給scanf函數以便scanf c

scanf("%d",a); 

你的價值只是傳遞給scanf所以它不能改變的a值:因爲如果你打電話scanf這樣hanges變量a的價值。

但是當你使用printf,功能printf無須更改變量a的值,因此它是正確調用printf這樣,它會成功編譯:

printf("%d",a); 

你可以閱讀更多here(其實這語法在一些語言中使用)

+0

我認爲你在解釋這件事上做得很好,如果沒有鏈接到一個微妙不同的概念,這個答案會更好...... – Sebivor

0

它應該是這樣的: -

#include <stdio.h> 

int main()    
{ 
      int a; 

      printf("Input: "); 
      scanf("%d", &a); 
      printf("\n%d", a); 
      a+=2; 
      printf("\n%d", a); 
      a+=4; 
      printf("\n%d", a); 
      a+=2; 
      printf("\n%d", a); 
      return 0; 
} 

printf()功能用於在屏幕上,這就是爲什麼我們不使用&運營商printf()功能,當你從用戶輸入,比如在scanf()功能,所以&運算符用於打印消息,你所要做的是消除&在每printf()功能休息是好的。

0

你一些提示:

  • 當您使用scanf()從用戶獲得的價值和存儲,總是用這樣的:&a

  • 打印時使用printf()任何價值從來沒有把&a 。只使用a

所以從printf()刪除&aa

+0

大部分是正確的。 'scanf'需要一個指針,所以指向'char'的指針應該直接傳遞,而不是'&'。當然,你可能真的想要打印一個指針值,在這種情況下,你可以在'printf'中使用'&'。 –

+0

第一個提示無效。在'%s'的情況下,「相應的參數應該是一個指向字符數組的初始元素的指針,該字符數組的大小足以接受該序列並終止空字符」。 char str; scanf(「%s」,&a);''很愚蠢,因爲'&a'不是用來表示一個指向大於1個字符的數組的第一個元素的指針,並且該數組唯一可以存儲的字符串是空的。 char a [N]; scanf(「%s」,&a);'更糟,因爲'&a'不是「指向初始元素的指針」,因爲編譯器可能會發出警告**總之,'scanf(「%s」 s「,&a);'*總是*錯誤。** – Sebivor

相關問題