#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int c;
while(true)
{
c = scanf("%d", &c);
if(c==12)
{
printf("goes in");
break;
}
}
return 0;
}
我還在學習C,我被困在這里。我的代碼很簡單,但我不知道為什么它不起作用。while 回圈正常運行,但是盡管滿足條件,但我無法訪問 if 陳述句。
謝謝!
uj5u.com熱心網友回復:
該scanf函式回傳匹配的模式數。因此,如果您鍵入一個數字并按 ENTER,該數字將首先c由該函式存盤,然后它將回傳值 1 表示讀取了 1 個值。然后將回傳值 1 分配給c,覆寫您輸入的任何數字。
跳過分配,c并將具有您輸入的值。
scanf("%d", &c);
if(c==12)
{
printf("goes in");
break;
}
或者更好的是,將回傳值分配給不同的變數,以查看是否確實輸入了數字。
int rval = scanf("%d", &c);
if(rval == 1 && c==12)
{
printf("goes in");
break;
}
uj5u.com熱心網友回復:
scanf充滿了陷阱。(http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)。作為初學者,您最好完全避免它。(作為任何級別的程式員,避免它是明智的!)。要穩健地完成這個簡單的程式,您必須做一些事情。考慮:
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
int c, rv;
while( (rv = scanf("=", &c)) != EOF ){
if( rv == 0 ){
int k;
/* Consume a line of input */
while( (k = getchar()) != EOF && k != '\n' ){
;
}
} else if( c == 12 ){
printf("goes in\n");
break;
}
}
return 0;
}
由于c未初始化,因此如果您嘗試讀取它的值而不首先分配它,程式的行為是不確定的。 scanf可能不賦值就回傳,如果不檢查回傳的值scanf確保為1,則無法讀取c. 此外,使用%d總是受到未定義行為的影響,因為可以讀取表示不適合整數的值的字串。通過使用=,我們避免了這種可能性(語言標準規定整數可以包含 -99 到 999 之間的所有整數值)。最后,如果回傳 0,則需要消費資料scanf,因為回傳 0 表示scanf沒有消耗任何資料。(這并不完全是零回傳的含義,但在這種情況下就是如此。)如果您嘗試scanf再次呼叫而不消耗資料,則程式將處于自旋回圈中。
作為初學者,最好的選擇就是停止使用scanf.
uj5u.com熱心網友回復:
正如已經指出的那樣,您正在重新分配c在呼叫中獲取其值的變數scanf
scanf("%d", &c);
^^^^
與函式的回傳值scanf
c = scanf("%d", &c);
根據 C 標準(7.21.6.4 scanf 函式)
3 如果在第一次轉換(如果有)完成之前發生輸入故障,scanf 函式將回傳宏 EOF 的值。否則,scanf 函式會回傳分配的輸入項的數量,如果出現早期匹配失敗,該數量可能會少于提供的數量,甚至為零。
我寫了我的答案,因為我想建議用以下方式重寫 while 回圈
#include <stdio.h>
int main( void )
{
int c;
while ( scanf("%d", &c) == 1 )
{
if ( c == 12 )
{
printf( "goes in\n" );
break;
}
}
return 0;
}
或者由于變數c僅在 while 回圈的主體內使用,因此最好在c將宣告變數的范圍內使用 for 回圈。您應該在使用它們的最小范圍內宣告變數。
#include <stdio.h>
int main( void )
{
for ( int c; scanf("%d", &c) == 1; )
{
if ( c == 12 )
{
printf( "goes in\n" );
break;
}
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519811.html
標籤:C循环if 语句while循环扫描
