一、getint函數的介紹
getint是一個C標準庫命令,用於讀取下一個整數值。該函數從標準輸入流(stdin)中讀取下一個整數,並將其存儲到指定的地址中。
函數原型:int getint(int *pn)
在讀取輸入時,該函數會忽略空格和製表符,並在遇到非數字字符時停止讀取並返回。
二、getint函數的使用
下面是一個簡單的示例代碼:
#include <stdio.h> int main() { int n = 0; while(getint(&n) != EOF) printf("%d\n", n); return 0; }
當用戶在控制台中輸入若干個數字時,該程序會逐個讀取並輸出這些整數。
三、getint函數的實現
下面是getint函數的實現代碼:
#include <ctype.h> int getch(void); void ungetch(int); /* getint函數:讀取下一個整數到*pn中 */ int getint(int *pn) { int c, sign; while(isspace(c = getch())) /* 跳過空格和製表符 */ ; if(!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); /* 不是數字 */ return 0; } sign = (c == '-') ? -1 : 1; if(c == '+' || c == '-') c = getch(); for(*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if(c != EOF) ungetch(c); return c; }
該實現代碼中使用了ctype.h庫中的isspace和isdigit函數。isspace用於判斷一個字符是否為空格或製表符。isdigit用於判斷一個字符是否為數字。同時,getch和ungetch函數也是由該例實現代碼提供的。
四、getint函數的錯誤處理
在實際使用getint函數時,需要進行錯誤處理以確保程序的正確性。以下是幾個可能出現的錯誤,並提供了對應的解決方案。
4.1 輸入中包含非法字符
如果輸入中包含非數字字符,getint函數將返回0,並將該字符推回到輸入流中以供下次讀取。在下面的示例程序中,非法字符會被打印:
#include <stdio.h> int main() { int n = 0, rc; while((rc = getint(&n)) != EOF) { if(rc == 0) { printf("非法字符\n"); break; } printf("%d\n", n); } return 0; }
4.2 輸入中包含多個數字
在輸入中包含多個數字時,getint函數需要將它們分別讀取,並且要避免多次將同一個數字讀取到緩存中。下面的示例程序展示了如何正確處理這種情況:
#include <stdio.h> int main() { int n = 0, rc; while((rc = getint(&n)) != EOF) { if(rc == 0) { printf("非法字符\n"); break; } else if(rc > 0) { printf("%d\n", n); n = 0; /* 重置n的值 */ } } return 0; }
五、getint函數的擴展
為了滿足不同的需求,getint函數還可以進行一些擴展。下面是幾個可能有用的例子。
5.1 getfloat函數
getfloat函數是getint函數的擴展版本,用於讀取浮點數。以下是getfloat函數的一種實現方式:
#include <ctype.h> int getch(void); void ungetch(int); /* getfloat函數:讀取下一個浮點數到*pn中 */ int getfloat(float *pn) { int c, sign; float power; while(isspace(c = getch())) /* 跳過空格和製表符 */ ; if(!isdigit(c) && c != EOF && c != '+' && c != '-' && c != '.') { ungetch(c); /* 不是數字 */ return 0; } sign = (c == '-') ? -1 : 1; if(c == '+' || c == '-') c = getch(); for(*pn = 0.0; isdigit(c); c = getch()) *pn = 10.0 * *pn + (c - '0'); if(c == '.') c = getch(); for(power = 1.0; isdigit(c); c = getch()) { *pn = 10.0 * *pn + (c - '0'); power *= 10.0; } *pn *= sign / power; if(c != EOF) ungetch(c); return c; }
5.2 不區分正負號的getint函數
由於getint函數返回值要麼是EOF,要麼表示讀取到的字符,因此不能直接用來表示讀取的整數值是否為正。以下是一種不區分正負的getint函數實現方法:
#include <ctype.h> int getch(void); void ungetch(int); /* getint函數:讀取下一個整數到*pn中 */ int getint(int *pn) { int c, rc; while(isspace(c = getch())) /* 跳過空格和製表符 */ ; if(!isdigit(c) && c != EOF && c != '+' && c != '-') { ungetch(c); /* 不是數字 */ return 0; } rc = (c == '-') ? -1 : 1; if(c == '+' || c == '-') c = getch(); for(*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= rc; if(c != EOF) ungetch(c); return c; }
5.3 支持科學計數法的getfloat函數
getfloat函數還可以支持科學計數法。以下是getfloat函數的擴展實現:
#include <ctype.h> int getch(void); void ungetch(int); /* getfloat函數:讀取下一個浮點數到*pn中 */ int getfloat(float *pn) { int c, sign, exp_sign, exp_value; float power; while(isspace(c = getch())) /* 跳過空格和製表符 */ ; if(!isdigit(c) && c != EOF && c != '+' && c != '-' && c != '.') { ungetch(c); /* 不是數字 */ return 0; } sign = (c == '-') ? -1 : 1; if(c == '+' || c == '-') c = getch(); for(*pn = 0.0; isdigit(c); c = getch()) *pn = 10.0 * *pn + (c - '0'); if(c == '.') c = getch(); for(power = 1.0; isdigit(c); c = getch()) { *pn = 10.0 * *pn + (c - '0'); power *= 10.0; } if(c == 'e' || c == 'E') { exp_sign = 1; c = getch(); if(c == '+' || c == '-') { exp_sign = (c == '-') ? -1 : 1; c = getch(); } for(exp_value = 0; isdigit(c); c = getch()) exp_value = 10 * exp_value + (c - '0'); if(exp_sign == 1) while(exp_value-- > 0) power *= 10.0; else while(exp_value-- > 0) power /= 10.0; } *pn *= sign / power; if(c != EOF) ungetch(c); return c; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/233964.html