2012-05-02 28 views
3

我寫了接受輸入的一個字符,輸出該字符的程序,這樣爲什麼getchar調用printf會停止工作?

int ch = getchar(); 
printf("%c", ch); 

它的工作就像我的預期。然後我決定首先歡迎並打印Hello

printf("Hello!\n"); 
int ch = getchar(); 
printf("%c", ch); 

令我驚訝的是,這引起了編譯器扔了兩個錯誤:

錯誤C2065: '頻道':未聲明的標識符
錯誤C2143:語法錯誤:缺少 ';' 'type'

我沒有明白爲什麼添加第一行會導致這種情況發生。無論如何,我重構了程序來擺脫int聲明,並且錯誤消失了。

printf("Hello!\n"); 
printf("%c", getchar()); 

發生了什麼事?什麼是導致這些錯誤出現然後消失的魔法?

+1

你使用什麼編譯器?此代碼在gcc 4.4.3上無錯誤。 –

+0

@AdamCadien我正在使用Visual Studio 2010附帶的MSVC的任何版本。 –

回答

3

開始後創建新的變量在C89標準不允許允許在新的C99標準。

您正在使用不完全符合c99的舊編譯器或編譯器。
您的代碼示例應該在任何優秀的編譯器上按原樣工作。 Works on gcc-4.3.4


替代解決方案:

您可以用兩種方式擺脫的問題:
聲明變量在塊的開頭:

int ch; 
printf("Hello!\n"); 
ch = getchar(); 
printf("%c", ch); 

申請宣告該變量創建一個新的塊:

printf("Hello!\n"); 
{ 
    int ch = getchar(); 
    printf("%c", ch); 
} 

建議:

你真的應該改變你的編譯器,因爲如果我沒有記錯的GCC支持這是編譯器擴展,甚至在c99之前。

5

如果您使用的是較舊的c編譯器,則必須在所有其他變量聲明之前進行所有變量聲明。嘗試:

int ch; 
printf("Hello!\n"); 
ch = getchar(); 
printf("%c", ch); 
+0

實際上,大約1985年之前的C編譯器要求任何變量聲明在任何可執行語句之前在範圍(「{}」)中首先出現。如果仍然有編譯器這樣做,那麼它很容易替換爲任何優秀的免費編譯器,例如['gcc'](http://gcc.gnu.org/)。 – wallyk

+0

哦,那麼Visual Studio C編譯器不支持C99功能? –

+0

@PeterOlson:應該的。給出這樣的錯誤需要一個非常舊的MSC版本。也許還有其他錯誤,比如缺少分號? – wallyk

2

在C99之前的版本C不允許「混合聲明和代碼」,這意味着您必須在範圍的開頭聲明所有變量。現代C編譯器允許混合聲明和代碼,就像C++編譯器一樣。一些非C99編譯器甚至允許它作爲擴展。

我認爲這是爲了讓編譯器更容易確定堆棧上實際需要多少空間,或者沿着這些線需要多少空間。

0

也許你正在使用一個非常古老的C編譯器。可能有一個支持C89。 使用這樣迫使你區塊內任何事情之前聲明任何變量(例如一個功能或主要) 兩條出路: 聲明第一章:

int ch = getchar(); 
printf("Hello!\n"); 
printf("%c", ch); 

,或者甚至更好,試着改變你的編譯器。你在使用什麼操作系統?視窗? Linux呢?蘋果電腦?

此外,一個快速筆記。您正在使用getchar來獲取整數。

嘗試使用而不是getchar,scanf(「%d」,& ch)。或者,如果您確實需要使用getchar並將其打印爲char,則將ch聲明爲char本身,如果需要再次使用它作爲整數,則使用itoa函數,將char轉換爲整數。

+0

這個答案沒有任何意義,'getchar()'返回'int',所以'ch'是'int'。另外,您不需要使用'itoa()'將'int'轉換爲'char'。 – dreamlax

+0

我想你不明白我的意思是用itoa()。如果他真的需要(由於某種原因在代碼中)使用ch作爲char而不是int,他可以使用itoa()將char轉換回整數。 –