一、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-tw/n/233964.html
微信掃一掃
支付寶掃一掃