簡體   English   中英

驗證輸入在 C 中具有一定的長度

[英]Validating input is of certain length in C

我的程序要求用戶輸入由 16 個字符組成的輸入(不包括 null 終止符),然后將其存儲在單獨的字符串中。 這是我當前的代碼:

void takeInput16(char *inputStr, int size){
do{
    printf("Enter a string of length 16\n");
    fgets(inputStr, size, stdin);
  } while(!(inputStr[size - 2] == '\n' && inputStr[size - 3] != '\0'));
}

int main(){
  char *num1 = malloc(18 * sizeof(char));
  char *num2 = malloc(18 * sizeof(char));
  takeInput16(num1, 18);
  takeInput16(num2, 18);


  return 0;
}

這適用於檢測少於 16 個字符的輸入,但是它不能處理超過 16 個字符的輸入,因為它會導致多次調用 fgets。

我的問題是,我怎樣才能安全地輸入 C 並確保它在字符方面具有一定的大小(我想拒絕輸入太長而不是簡單地截斷多余的字符)

假設輸入是 ASCII,您可以使用fgetc逐個讀取字符,直到緩沖區已滿或檢測到\n 如果緩沖區已滿,請繼續讀取直到檢測到\n ,如下例所示。

請注意,當 size 為 5 時,此示例將讀取最多 4 個字符,它需要為結尾處的空終止字符留出空間。 stdin不需要EOF檢查,但您最好將其放在那里,以防輸入被重定向。

int takeInputx(char* buf, int bufsize)
{
    buf[bufsize - 1] = '\0';
    for (int i = 0; ; i++)
    {
        int ch = fgetc(stdin);
        int end = (ch == '\n' || ch == EOF);
        if (i < bufsize - 1)
            buf[i] = end ? '\0' : (char)ch;
        if (end)
            return i;
    }
    return 0;
}

int main() 
{
    int size = 5;
    char* num1 = malloc(size * sizeof(char));
    for (int i = 0; i < 3; i++)
    {
        int res = takeInputx(num1, size);
        printf("%s, string len %d, exceeds max size? %d\n", 
            num1, strlen(num1), res >= size);
    }
    free(num1);
    return 0;
}

您的代碼未正確檢查輸入: null 字節應為偏移size - 1和換行符為偏移size - 2 ,但最重要的是您應該檢查fgets()沒有失敗並且輸入的長度是size - 1

這是修改后的版本:

#include <stdio.h>
#include <string.h>

void takeInput(char *inputStr, int size) {
    for (;;) {
        printf("Enter a string of length %d\n", size - 2);
        if (!fgets(inputStr, size, stdin)) {
            perror("input error");
            abort();
        }
        if (strlen(inputStr) < size - 1) {
            printf("input too short, need %d bytes\n", size - 2);
            continue;
        }
        if (inputStr[size - 2] != '\n') {
            int c;
            /* read and discard the rest of the input line */
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            printf("input too long, need %d bytes\n", size - 2);
            continue;
        }
        inputStr[size - 2] = '\0';  /* strip the newline */
        break;
    }
}

int main() {
    char *num1 = malloc(18 * sizeof(char));
    char *num2 = malloc(18 * sizeof(char));
    takeInput(num1, 18);
    takeInput(num2, 18);

    printf("num1: %s\n", num1);
    printf("num2: %s\n", num2);

    free(num1);
    free(num2);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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