【发布时间】:2020-02-22 05:25:11
【问题描述】:
用C编程语言,
我正在尝试读取字符串输入并将其存储到具有固定大小 [11] 的 char 数组中。
当我输入的字符超过 10 个时,其余字符被发送到下一个 scanf。
所以我的问题是,
有没有什么办法可以限制输入的大小?
或者,当输入超过一个char数组的大小时,有什么办法可以截掉剩下的字符,而不是发送到下一个scanf?
或者,我应该只知道要输入多少个字符吗?
或者,我应该创造条件来防止这个问题发生吗?
int main(void)
{
char phoneNum[11];
char password[11];
printf("Enter the phone Number: ");
scanf("%10s", phoneNum);
printf("Enter the password: ");
scanf(" %10s", password);
printf("\n\n");
//Display
printf("Phone number: %s\n", phoneNum);
printf("Password : %s\n", password);
return 0;
}
/*
What I tried:
-input:
Enter the phone Number: 123-456-7890
Enter the password: // This part has been skipped.
-output:
Phone number: 123-456-78
Password: 90
What I expected:
-input:
Enter the phone Number: 123-456-7890
Enter the password: asdf12386945648
-output:
Phone number: 123-456-78
Password: asdf123869
*/
【问题讨论】:
-
为此使用
scanf()以外的其他内容。例如。使用fgets()或getline()读取整行,然后使用strtok()在空白处将其拆分,并使用strncpy()从每个标记复制到具有大小限制的目标数组。 -
你正好违反了
scanf的限制。当它停止读取时,出于任何原因(例如因为它达到字符数),它总是将所有未读输入留在输入流中,以便读取格式字符串的下一部分,无论您是否愿意。 -
您可以使用巧妙插入的
%*s或%*[...]说明符来处理未读输入。 (*表示扫描但不分配给变量。) -
两个一般规则: (a)
scanf基本上是一个玩具。您可以将它用于定义明确的输入,但如果您想要优雅地处理“非法”输入(例如,用户应该只输入 10 个字符,但肆意输入更多),通常很难实现这种优雅在scanf内处理。为了做得更好,您通常最好使用scanf以外的其他东西。 (b) 最好将这些长度说明符视为限制目标数组的溢出,not 将用户的输入限制为您认为正确的某个确切值。 (更多在下一条评论中。) -
最好将
%s视为“读取任意长度的字符串”(尽管这最终会非常危险),而将%##s视为“读取任意长度的字符串,但不要溢出我分配的这个希望足够大但最终大小固定的数组。”如果您想说的是“哟,用户,您不允许输入任意长度的字符串,您最多可以输入 N 个字符,就是这样 ",scanf本身并不是这项工作的好工具。您最好阅读任意长度的字符串,然后作为第二步调用strlen并进行投诉。