[英]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.