[英]How to check if user input numbers instead of string(array of char) in C
因此,作為一名學生,我得到了這項作業,要求我使用C創建一個簡單程序。該程序輸入僅允許您輸入字符A
- Z
, a
- z
和 (空間)。 字符串的長度應不少於1個字符且不超過100個字符。
因此,得出的結論是,我應該使用if
函數來驗證用戶是否輸入了允許的字符。
#include <stdio.h>
#include <ctype.h>
int main()
{
char name[100];
scanf("%s",&name);
fflush(stdin);
if (isdigit(name))
^^^^
{
printf("Wrong answers");
getchar();
}
else
....
如果您在其中輸入數字,則應該打印"wrong answers"
,但此程序將無法運行。
錯誤C2664:“ isdigit”:無法將參數1從“ char [100]”轉換為“ int”
我不知道這個錯誤是什么意思。 還是我使用了錯誤的功能?
我也嘗試過
if (((name>='A')&&(name<='Z'))||((name>='a')&&(name<='z')||)((name==' ')))
{
//this print what i want
}
else
{
printf("wrong answers");//this print "wrong answer"
}
但是無論我輸入正確還是輸入"wrong answers"
它始終會打印"wrong answers"
。
非常感謝您的幫助。 謝謝。
* ps:我是編程的初學者。
isdigit()
以int
作為參數,而不是char*
:
int isdigit(int c);
您必須在字符串上使用循環並檢查其中的每個字符。
話雖如此,要實現:
該程序輸入僅允許您輸入字符'A'-'Z','a'-'z'和''(空格)
您最好使用isalpha()
。
試試看:
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char name[101], temp;
// take input one character at a time
while(scanf("%c", &temp)){
// stop when newline or carriage return
if(temp == '\n' || temp == '\0' || !isalpha(temp) ){
break;
}
// save character in array
name[i] = temp;
// move to the next position of the array
i++;
}
printf( "%s", temp );
return 0;
}
您看到的問題是,給isdigit
傳遞了錯誤的值類型-它期望一個int
值,但您正在向其傳遞一個char
數組。 您將必須遍歷字符串中的每個字符,以檢查它是否是數字。
但這最終不是您想要的,因為您要確認字符串包含字母或空格-可能輸入的許多字符沒有被誤認為數字不會被歸類為數字。
最適合您的解決方案是使用功能strspn
。 它接受一個字符串,並返回與第二個參數匹配的字符數的長度。 如果該長度與您的字符串的長度相同,則說明它僅包含有效字符。
size_t valid;
valid=strspn(name, "abcdefg(fill in with other valid characters)");
if(valid==strlen(name))
{
// Valid name
}
else
{
// Not valid
}
如果您需要擴展接受的字符,這只是將它們添加到第二個參數的簡單情況。
OP的代碼失敗,因為isdigit()
測試是單個字符是數字(0-9)。 它不測試字符串。
int isdigit(int c);
isdigit
函數測試任何十進制數字字符。
在所有情況下,參數都是一個int
,其值應表示為unsigned char
或等於宏EOF
的值。
OP的緩沖區太小,無法保存從用戶讀取的100個字符。 至少還需要1個來檢測是否讀取了太多內容,並且還需要1個以上的空字符來標記字符串的結尾 。
fflush(stdin);
也有問題 。
scanf("%s",&name);
不節省空格。 該參數也應該是name
。 (否&
)
使用fgets()
讀取一行用戶輸入,它將結果保存為string 。 測試輸入是否符合條件。
讀
#define N 100
// No need to be stingy on buffer size reading user input. Suggest 2x
// We need +1 for extra character detection, \n and \0
char buf[2*N + 1 + 1];
fgets(buf, sizeof buf, stdin);
// lop off potential \n
size_t length = strlen(buf);
if (length > 0 && buf[length-1] == '\n') {
buf[--length] = '\0';
}
測試
僅字符'A'-'Z','a'-'z'和''(空格)。
for (size_t i = 0; i<length; i++) { if (!isalpha((unsigned char)buf[i]) && buf[i] != ' ') { puts("Invalid chracter"); break; } }
字符串的長度應不少於1個字符且不超過100個字符。
if (length < 1 || length > 100) { puts("Input wrong length"); }
其他方法可用於取消非常長的輸入的資格。 IMO, 很長的輸入表示攻擊,因此應該與有點長的簡單行以不同的方式進行處理。
if (length < 1 || length > 100) {
if (length + 2 >= sizeof buf) {
puts("Input way too long");
exit (EXIT_FAILURE);
}
puts("Input wrong length");
}
name
的\\0
( NUL
)字符必須有一個額外的空格。 因此,要存儲100個字符,其大小應至少為101。
char name[101];
你可以先用
fgets(name, sizeof(name), stdin);
讀入name
字符數組。
請注意, fgets()
還將讀取尾隨換行符( \\n
),需要將其刪除,例如
name[strlen(name)-1]='\0';
然后使用sscanf()
。 喜歡
size_t l=strlen(name);
sscanf(name, "%100[A-Za-z ]", name);
if(strlen(name)!=l)
{
printf("\nInvalid input.");
}
注意A-Za-z
后面的空格。
在100
中%100[A-Za-z]
表示閱讀至多100個字符到name
。 如果遇到不是空格的非字母字符,則[A-Za-z ]
將使sscanf()
停止讀取。
首先讀入name
。 然后將其長度存儲在l
。 直到一個空格以外的非字母發生在現在看什么name
來name
本身(從而修改name
)。
現在,將此新字符串的長度與l
。 如果它們相同。 輸入的內容根據您的需要有效。
您也可以使用scanf()
代替fgets()
scanf("%100[^\n]", name);
它指示讀取每個字符,直到一個\\n
為name
。 如果使用此選項,則與fgets()
情況不同,不會在name
末尾添加\\n
。
現在,我想指出您的代碼中的一些錯誤。
scanf("%s",&name);
會導致錯誤。 正確的是
scanf("%s",name);
因為這里的第二個參數必須是一個地址,並且由於C中的數組名稱會衰減為其基地址,所以使用name
代替&name
。
正如其他人指出的那樣,在stdin
上使用fflush()
是未定義的,必須避免。
如果您嘗試清除輸入緩沖區直到下一個換行符( \\n
),則可以執行
int ch;
while((ch=getchar())!='\n');// && ch!=EOF)
isdigit()
的參數必須是一個char
而不是一個字符數組(如果size為100,則鍵入char [100]
)。
a function. 而if
是一個語句而一個函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.