2012-12-11 75 views
2

我是「C」的學習和編寫的代碼,但在我編譯它,顯示調試錯誤消息,這裏是代碼:獲取調試錯誤使用C

#include<stdio.h> 
void main() 
{ 
    int n,i=1; 
    char c; 
    printf("Enter Charecter:\t"); 
    scanf("%s",&c); 
    printf("Repeat Time\t"); 
    scanf("%d",&n); 
    n=n; 
    while (i <= n) 
    { 
     printf("%c",c); 
     i++; 
    } 
} 

請告訴我爲什麼出現這種情況,如何解決呢

+2

你能告訴我們實際的錯誤信息嗎? – Almo

+1

'N = N;' - 這是什麼打算呢? – mah

+0

你有'主要'功能不兼容標準 – triclosan

回答

2

我不知道你明白的回答你的其他問題:Odd loop does not work using %c

這些format specifiers分別用於特定的工作。

如果你想獲得一個:

  • 字符從stdin使用%c
  • 字符串(一串字符)使用%s
  • 整數使用%d

此代碼:

char c; 
printf("Enter Character:\t"); 
scanf("%c",&c); 

將從stdin讀1個字符,並會留下一個換行符('\n')字符出現。所以我們可以說,用戶輸入的字母A你有stdin緩衝:

A\n 

scanf()將拉動'A'並將其存儲在您的char c和將離開的換行符。接着,它會詢問你的int和用戶可能輸入5stdin現在有:

​​

scanf()將採取5並將其放置在int n。如果你想消費'\ n'有一些選項,其中一個是:

char c; 
printf("Enter Character:\t"); 
scanf("%c",&c); // This gets the 'A' and stores it in c 
getchar();  // This gets the \n and trashes it 
+0

感謝Mike現在對我很清楚,helpz a lottt ,,:D –

+0

@JessicaLingmn - 很高興幫忙,換行符似乎讓很多人出去了 – Mike

3

scanf("%s",&c);應該scanf("%c",&c);

%s格式說明符告訴scanf你傳遞一個字符數組。您傳遞的是單個字符,因此需要使用%c

您當前的代碼將出現不可預知,因爲scanf會嘗試寫一個任意長的字,接着一個NUL終止向您提供的地址。這個地址爲單個字符分配了內存(在堆棧上),所以最終會覆蓋可能被程序其他部分使用的內存(比如其他局部變量)。

+0

感謝您的觀念幫助很多:) –

3

scanf("%s", &c)被寫入存儲器它不應該作爲c是單char"%s"預計其一個參數是一個數組。由於scanf()附加一個空字符,它至少會寫兩個charccharstdin讀取加上空終止符),這太多了。

使用char[]和限制的charscanf()寫入數:

char data[10]; 
scanf("%9s", data); 

並使用printf("%s", data);代替%c,或使用"%c"作爲scanf()格式說明。

經常檢查scanf()的返回值,這是成功的分配數量,以保證後續的代碼不處理陳舊或初始化的變量:

if (1 == scanf("%d", &n)) 
{ 
    /* 'n' assigned. 'n = n;' is unrequired. */ 
} 
+0

感謝您的信息 –

0

這裏是你的代碼的工作版本。請參閱聯代碼註釋的修訂:

#include<stdio.h> 
void main() 
{ 
    int n,i=1; 
    char c; 
    printf("Enter Character:\t"); 
    scanf("%c",&c);//Use %c instead of %s 
    printf("Repeat Time\t"); 
    scanf("%d",&n); 
    n=n;//SUGGESTION:This line is not necessary. When you do scanf on 'n' you store the value in 'n' 
    while (i <= n)//COMMENT:Appears you want to print the same character n times? 
    { 
     printf("%c",c); 
     i++; 
    } 
    return;//Just a good practice 
} 
+0

1 )void main是極其糟糕的*練習。 2)如果I/O緩衝(它可能將是),就不會看到從printf的輸出時的scanf完成 3)N = N分配是完全沒有意義的。 –

+0

亞我想打印相同的字符n次...感謝讓我感覺:) –

+1

@湯姆坦納:1)同意。 gcc通常不會允許這樣的代碼。但是,因爲它知道哪個編譯器OP使用,盡最大努力保持代碼不變。 2)取決於緩衝機制。但是,代碼是有效的C,並且肯定會按預期工作。 3)我已經建議將OP作爲評論中的在線評論。 – askmish