簡體   English   中英

c中的逐行輸入

[英]Line wise input in c

如何在c中執行以下輸入限制?

第一行包含float,第二行包含float,第三行int,

在控制台中按Enter三次后,程序應該能夠讀取每一行並將內容分別放入int,int,float變量中。

三按Enter鍵后,程序不應等待用戶輸入並開始驗證。

一些測試用例

line1: 34
line2:4
line3:12
result: ok

line1: 
line2:4
line3:12
result: not ok 

line1: Hi
line2:4
line3:12
result:  not ok 

到目前為止,我已經使用了基礎知識

    scanf("%f",&p);
    scanf("%f",&r);
    scanf("%d",&t);

它適用於測試用例1和3,但當我留空行時失敗。

您應該始終檢查scanf的返回值。

原因是,返回值是scanf用於傳達轉換錯誤以及其他錯誤的內容。 例如,如果您的程序告訴scanf期望使用十進制數字序列,並且scanf遇到與該模式不匹配的內容,則返回值將指示此失敗。

返回的值將是成功分配的項目數。 例如,

char str[128];
int x, y = scanf("%d %127s", &x, str);

如果y為1,則應假定x是可以安全使用的。 如果y為2,則應假定xstr都可以安全使用。

這回答了部分問題。 下一部分是如何確保輸入采用的形式。 scanf並不嚴格處理 它處理其他單位,例如%d是編碼為十進制數字序列(和符號)的int 十進制數字序列結束后,它將返回...無法保證十進制數字將占據整個行

實際上,這里存在兩個問題:前導空格尾隨空格。 [cCn之外,所有格式說明符都將導致前導空白被丟棄。 如果要以不同的方式處理前導空格,則需要整理一下如何處理前導空格。

考慮到丟棄用戶輸入幾乎總是(如果不總是這樣)一個壞主意。 如果您不在乎該行的其余部分,則可以使用諸如scanf("%*[^\\n]"); getchar(); scanf("%*[^\\n]"); getchar(); 舍棄所有尾隨的'\\n'換行符...第一個語句將嘗試讀取盡可能多的非換行符,第二個語句將舍棄終止的換行符。 但是,如果要確保輸入占據整個行,則需要測試getchar返回的值。

使用所有這些注意事項的示例:

/* Test for leading whitespace (including newlines) */
int c = getchar();
if (c != '-' && !isdigit(c)) {
    /* Leading whitespace found */
}
ungetc(c);

/* Test for correct data conversion */
int x, y = scanf("%d", &x);
if (y != 1) {
    /* Something non-numeric was entered */
}

/* Test for trailing newline */
c = getchar();
if (c != '\n') {
    /* Trailing newline found */
}

有了這些信息,如果您有任何問題,也許您可​​以嘗試並用一些代碼更新您的問題...

PS:我在您編寫的代碼中注意到,您似乎對%f%d感到困惑; %f用於讀取float%d用於讀取int ,而不是相反...

閱讀行明智的輸入后 ,我知道必須使用fgets + sscanf而不是直接scanf 當然,您可以使用getc / getchar作為解決方法,但是您可以得到一些極端的案例,在這些案例中我可以找到fgets + sscanf 單獨在一行上獲得浮點數的示例:

char line[80], dummy[2];
float val;
if (fgets(line, sizeof(line), stdin) == NULL)... 
if (sscanf(line, "%f%1s", &val, dummy) != 1)...
// Ok val was alone on the line with optional ignored blanks before and/or after

您還可以添加對loooong行的測試:

if ((line[0] != 0) && (line[strlen(line)-1 != '\n'))...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM