我碰到這個代碼(即作品)跌跌撞撞:......爲什麼它的工作原理?
它不起作用,一般來說。太多的失敗案例
給定的輸入可以是單個字符Z
,後續代碼未定義行爲(UB)作爲scanf()
不分配a
。結果:(int)a
是UB。
scanf("%f",&a);
q=(int)a;
給定的輸入可能是「123456789」,東西的int
的範圍之外,然後用(int)a
轉換也UB。
如果a
取值爲INT_MAX
,++q;
爲UB。
輸入值可以精確地表示爲int
而不是float
失敗OP的代碼。被四捨五入到整數像"0.99999999999999999999999999999"
輸入 - >1.0f
失敗OP的檢測
替代。
scanf(), fgets()
不讀C字符串,int
,float
等取而代之的是,更好地把它們當作閱讀文本並將它們轉換爲C字符串,int
,float
。
f
in scanf()
意味着格式化輸入,這是未知的部分在這裏。最好避免scanf()
。
由於代碼需要檢測有關用戶輸入的各種內容,請使用fgets()
來讀取文本的行。然後使用strtol()
,strtoll()
,strtoul()
等查看輸入是否符合目標類型。
// Check if input fits in a `long`
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
puts("End-of-file or input error");
} else {
char *endptr;
errno = 0;
long ivalue = strtol(buf, &endptr, 0);
if (buf == endptr) puts("Fail: no conversion");
else if (*endptr != '\n' && *endptr != '\0') puts("Fail: Extra junk");
else if (errno) puts("Fail: Overlfow");
else printf("Success: %ld\n", ivalue);
}
該代碼是不可能的,如果你輸入987654321作爲價值的工作。如果您輸入ABC,則更不可能工作。 –
這段代碼與輸入是「char」還是「string」無關。 –
*總是*測試'scanf'的返回值,這裏應該是'1'。如果你想輸入一個'int',那麼這樣做,檢查1值是否被轉換,並檢查輸入流中的下一個「char」是否爲空格。 –