[英]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,則應假定x
和str
都可以安全使用。
這回答了部分問題。 下一部分是如何確保輸入采用線的形式。 scanf
並不嚴格處理行 ; 它處理其他單位,例如%d
是編碼為十進制數字序列(和符號)的int
; 十進制數字序列結束后,它將返回...無法保證十進制數字將占據整個行 。
實際上,這里存在兩個問題:前導空格和尾隨空格。 除[
, c
, C
和n
之外,所有格式說明符都將導致前導空白被丟棄。 如果要以不同的方式處理前導空格,則需要整理一下如何處理前導空格。
考慮到丟棄用戶輸入幾乎總是(如果不總是這樣)一個壞主意。 如果您不在乎該行的其余部分,則可以使用諸如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.