2010-12-09 106 views
1

我無法接受來自文本文件的輸入。我的程序應該讀取用戶指定的字符串,並且該字符串的長度在運行時確定。當用戶運行程序(手動輸入值)時它工作正常,但當我運行我的教師的文本文件時,它運行到無限循環。使用scanf在C中讀取一定數量的字符?

對於本示例,當我輸入4個字符並且他的文件中的輸入爲「ABCDy」時,將失敗。 「ABCD」就是我應該閱讀的內容,'y'應該稍後用於知道我應該重新開始遊戲。相反,當我用scanf讀入「ABCD」時,它也讀入'y'。有沒有辦法繞過這個使用scanf,假設我不知道字符串應該運行多久,直到運行時?

回答

0

嘗試

scanf("%4s", str) 
+0

它仍然是在結束在y閱讀。我不知道這個價值可能會持續多久。 – Kira 2010-12-09 23:59:13

13

通常情況下,你會使用類似"%4c""%4s"至最多4個字符閱讀(不同的是,"%4c"讀取下一個4個字符,而不管,而"%4s"跳過前導空白,如果有空白則停在空白處)。

但是,爲了在運行時指定長度,必須要稍微複雜一點,因爲不能使用嵌入了「4」的字符串文字。一種選擇是使用sprintf創建你會傳遞給scanf字符串:與printf您可以動態地通過將星號(*)在指定字段寬度或精度:

char buffer[128]; 

sprintf(buffer, "%%%dc", max_length); 
scanf(buffer, your_string); 

我也許應該補充格式字符串,並傳遞變量在適當的位置,以指定的寬度/精度:

int width = 10; 
int precision = 7; 
double value = 12.345678910; 

printf("%*.*f", width, precision, value); 

鑑於printfscanf格式字符串十分相似,人們可能會認爲同樣會與工作。不幸的是,情況並非如此 - scanf轉換規範中的星號表示應該掃描但未轉換的值。也就是說,輸入中必須存在的東西,但其值不會放在任何變量中。

+0

+1,我打算推薦它:) – ruslik 2010-12-10 00:05:02

-1

您可能會考慮簡單地將呼叫循環到getc()

+0

這與告訴某人想要畫80個像素來調用putpixel 80次是類似的。除了學術和基準測試環境外,這兩者都是一個壞主意,因爲不是對服務器提出單一請求,而是用任意數量的請求來轟炸它,每個請求的大小都比結果大。 – Dmitry 2017-11-10 00:22:46

0

您還可以使用FREAD,在這裏可以設置讀取限制:

char string[5]={0}; 
if(fread(string,(sizeof string)-1,1,stdin)) 
    printf("\nfull readed: %s",string); 
else 
    puts("error");