簡體   English   中英

掃描更多的值C

[英]Scanf more values C

我需要C中短代碼的幫助。我必須讀取輸入行上的浮點數,並用空格分隔,輸入以浮點0或EOF結尾。

如果我不知道有多少個數字或輸入內容,或者它是如何工作的,並問EOF如果我只讀數字而不是字符,該怎么辦?

感謝您的任何回復。

一行輸入示例:

12 11 10 45 50 12 EOF
12 10 11 45 0 

int main(void)  
{
    float num;
    float sum = 0;

    do{
       scanf("%f", num);
       sum += num;
    } while(EOF || num == 0);
    return 0;
}

scanf的手冊頁中-

scanf返回成功匹配和分配的項目數,該數量可以少於提供的數量,如果早期匹配失敗,則為零。 如果在第一次成功轉換或匹配失敗發生之前到達輸入結束,則返回EOF值。

這意味着scanf僅在被調用時遇到EOF作為第一個輸入時才返回EOF,因為EOF必須以換行符'\\ n'開頭,否則它將不起作用(取決於OS) 您還必須考慮scanf可能遇到的匹配失敗。

#include <stdio.h>

int main(void) {
    float num;
    float sum = 0;
    int val;

    while((val = scanf("%f", &num)) != EOF && val == 1) {
        sum += num;
    }

    if(val == 0) {
        printf("matching failure. input is not a float.\n");
    }
    else {
        printf("end of input.\n");
    }

    return 0;
}

scanf參考

成功時,該函數返回已成功填充的參數列表的項目數。 由於匹配失敗,讀取錯誤或文件結尾的范圍,此計數可以與預期的項目數匹配或更少(甚至為零)。

如果讀取時發生讀取錯誤或到達文件末尾,則會設置正確的指示符(低或錯誤)。 並且,如果在成功讀取任何數據之前發生任何一種情況,則返回EOF。

如果在解釋寬字符時發生編碼錯誤,則該函數將errno設置為EILSEQ。

因此,您可以將do-while循環重寫為類似

int retval;
while((retval = scanf("%f", &num)) != EOF && retval > 0 && num != 0) {
    sum += num;
}

if(retval == 0) {
    printf("input read error.\n");
}

符合您的約束。

還要注意,將變量傳遞給scanf() ,需要在變量前加上&前綴,因為該函數需要處理指針(您需要傳遞變量地址)。

編輯:

請參閱有關Windows中的EOF問題的主題

您可以像這樣重新編寫代碼

         int main(void) 
         {
            float num;
            float sum = 0;
            do
            {
               scanf("%f", &num);
               sum += num;
            } while((!feof(stdin)) && (num != 0));

            printf("%f", sum);
            return 0;   

          }

feof表示輸入流的結尾。

以下是執行此操作的一種更可靠的方法:

#include <stdio.h>
#include <string.h>

int main(void) {
  int sum=0;
  int num;
  char *p;
  char buf[1000];
  fgets(buf, 1000, stdin);
  p = strtok(buf," ");
  while(p!=NULL) {
    if(sscanf(p, "%d", &num) == 1) sum+=num;
    p = strtok(NULL, " ");
  }
  printf("the sum is %d\n", sum);
}

測試:

> testme 
1 2 3 4 0

the sum is 10

> testme 
1 2 3 4 ^D
the sum is 10

注意-在行尾時,必須兩次輸入ctrl-D才能獲得所需的效果。

通過閱讀“ KN King的C編程現代方法”,您可以消除疑問。

本書對此主題進行了適當的說明

測試的結果scanf()01EOF
測試掃描值0.0

int main(void) {
  float num;
  float sum = 0;
  int cnt;

  while ((cnt = scanf("%f", &num)) == 1) {
    if (num == 0.0) break;
    sum += num;
  }

  // cnt should be EOF, 0 or 1      

  if (cnt == 0) {
    printf("Input is not a number\n");
  }
  else {
    printf("Sum %f\n", sum);
  } 
  return 0;
}

盡管通常scanf()返回值EOF,0、1,...“格式說明符數”,但很少會出現值0。 輸入示例為“ +”。

暫無
暫無

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

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