簡體   English   中英

如何檢查用戶輸入數字而不是C中的字符串(字符數組)

[英]How to check if user input numbers instead of string(array of char) in C

因此,作為一名學生,我得到了這項作業,要求我使用C創建一個簡單程序。該程序輸入僅允許您輸入字符A - Za - 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';
}

測試

  1. 僅字符'A'-'Z','a'-'z'和''(空格)。

     for (size_t i = 0; i<length; i++) { if (!isalpha((unsigned char)buf[i]) && buf[i] != ' ') { puts("Invalid chracter"); break; } } 
  2. 字符串的長度應不少於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\\0NUL )字符必須有一個額外的空格。 因此,要存儲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 直到一個空格以外的非字母發生在現在看什么namename本身(從而修改name )。
現在,將此新字符串的長度與l 如果它們相同。 輸入的內容根據您的需要有效。

您也可以使用scanf()代替fgets()

scanf("%100[^\n]", name);

它指示讀取每個字符,直到一個\\nname 如果使用此選項,則與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.

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