簡體   English   中英

在while循環中使用scanf函數

[英]Using the scanf function in while loop

我正在嘗試為編程作業格式化以空格分隔的用戶輸入。

本質上,輸入由任意數量的表達式組成

L integer integer integer integerC integer integer integer

例如: L 1 1 5 7 C 4 5 3

到目前為止,我已經設法根據初始字符提取整數,並且可以使用 scanf 函數遍歷字符串:

char a;
while(scanf("%c", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        scanf("%d %d %d", &inputX, &inputY, &inputR);
        printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(a == 'L'){
        int x1, y1, x2, y2;
        scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}

不幸的是,雖然這會輸出所需的整數,但循環(和用戶輸入提示)不會終止。

有人能告訴我為什么會這樣嗎?

這是因為\\n總是在那里使scanf("%c", &a) == 1始終為真。
改變你的

while(scanf("%c", &a) == 1) 

while(scanf(" %c", &a) == 1)  
     //      ^space before format specifier.  

%c之前的空格將吃掉scanf留下的\\n (按Enter )。

原因是 scanf 直接從標准輸入讀取,並且在處理完該行后會阻塞並等待用戶輸入。 您需要做的是在 while 循環中讀取該行並處理該行。 我在下面修改了你的代碼。

char a;
char line[1024];

fgets(line, 1023, stdin);   // leave 1 character for null terminator
while(sscanf(line, "%c", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        sscanf(line, "%d %d %d", &inputX, &inputY, &inputR);
        printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(a == 'L'){
        int x1, y1, x2, y2;
        sscanf(line, "%d %d %d %d", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}

結合其他帖子的一些功能和一些補充。
sscanf()使用fgets()%n 請務必檢查sscanf()結果。

char line[1024];
while (fgets(line, sizeof line, stdin) != NULL)) {
  char *s = line; 
  char Type;
  int n;
  while(sscanf(s, " %c%n", &Type, &n) == 1) {
    s += n;
    if(Type == 'C') {
      int inputX, inputY, inputR;
      if (3 != sscanf(s, "%d %d %d%n", &inputX, &inputY, &inputR, &n)) {
        Handle_Syntax_Error();
      }
      s += n;
      printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(Type == 'L') {
      int x1, y1, x2, y2;
      if (4 != sscanf(s, "%d %d %d %d%n", &x1, &y1, &x2, &y2, &n)) {
        Handle_Syntax_Error();
      }
      s += n;
      printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
    else {
      Handle_Syntax_Error();
    }
  }
} 
char a;
    while(scanf("%[LC]", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        scanf("%d %d %d%*c", &inputX, &inputY, &inputR);
        printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(a == 'L'){
        int x1, y1, x2, y2;
        scanf("%d %d %d %d%*c", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}

"%[LC]" 確保只掃描 'L' 或 'C'。 相應地輸入 3 或 4 個整數后,'space' 或 'enter' 或 'any single character' 都將被丟棄 "%*c",之后,除 'L' 或 'C' 之外的任何內容都將中斷循環。

暫無
暫無

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

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