[英]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()
為0
, 1
或EOF
。
測試掃描值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.