2011-12-25 66 views
1

我明白當我更明確地使用getchar(),putchar()和while循環時會發生什麼;然而,我只是想知道,當下面的代碼執行(幕後)時,輸入字符串的存儲和處理是否相同?是否每個字符都被存儲爲「輸入」數組的一個元素? scanf如何做到這一點?等等。這個字符串是如何存儲和打印的?

#include <stdio.h> 

int main(void) 
{ 
    char typed[500]; 
    scanf("%[^\tEOF]", &typed); 

    printf("%s", typed); 
    return(0); 
} 

謝謝。

+0

hello bufferoverrun – knittl 2011-12-25 08:36:55

+1

'void main(void)'是壞的。雖然許多編譯器都允許它,但它不包含在C標準中,所以它不是便攜式的。我認爲C++標準甚至禁止它,因爲它要求main有返回類型'int'(但我避免C++足以不確定)。 – Lion 2011-12-25 09:13:02

+1

1998年的C++標準(可能是其修正案和2011年標準)在§3.6.1中說:_實現不應該預定義'main'函數。該功能不得超載。應該有 有一個int類型的返回類型,否則它的類型是實現定義的。 所有實現 應允許以下兩個'main'定義: int main(){/ * ... * /}' and 'int main(int argc,char * argv []){/ * ... * /}'...... – 2011-12-25 09:28:12

回答

3

是的,每個字符都被存儲爲數組typed的一個元素。

請注意,您的掃描字符串除了選項卡,'E','O'或'F'之外都會查找任何內容。該模式中的'EOF'與文件末尾的getchar()等返回的EOF無關。此外,您的代碼容易受到緩衝區溢出的影響(因此您可以從knittl得到簡短的評論),因爲您沒有在格式字符串中指定緩衝區的大小。你會更安全:

scanf("%499[^\tEOF]", &typed); 

而且,main()返回類型爲int,不void

+0

是不是缺少格式說明符?否:字符類'%[..]'和否定字符類'%[^ ...]'是字符串'%s'的替代方案。'%499 [^ \ tEOF] s' – dreamlax 2011-12-25 09:20:10

+0

正式的,他們被稱爲_scansets_。 – 2011-12-25 09:29:06

+0

啊,是的,沒錯。必須過去我的睡覺時間... – dreamlax 2011-12-25 09:31:32

1

每個元素都被保存爲數組的元素。當你的變量已經是數組時,你不應該使用&。數組名稱已經是一個地址。

getchar()具有默認的分隔符:返回鍵,並採取輸入的字符只有

scanf允許各種類型的輸入指定的格式爲:%s%d

您還可以指定爲scanf分隔符(默認是空格,製表符,輸入)

在你的情況下,分隔符被指定爲製表符或EOF

+0

小心你如何解釋'EOF';你所說的是模棱兩可的。我認爲你的意思是'E'或'O'或'F',因爲替代方案(即文件結束指示)是不正確的。 – 2011-12-25 09:12:36