所以问题是用户可以给出一个int的输入,或者用户可以给三个int的输入.这一切都取决于第一个输入.这里有点令人困惑的例子:
printf("Please enter input in this format: (-blackwhite | -color) colorvalue");
Run Code Online (Sandbox Code Playgroud)
用户输入"-blackwhite 40"所以我想
scanf("%s %u", charArray, &int);
Run Code Online (Sandbox Code Playgroud)
但是用户也可以输入"-color 254 254 254"然后我想要
scanf("%s %u %u %u", charArray, &int1, &int2, &int3);
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?在将数据扫描到变量之前,基本上验证数据.
除非你完全控制输入数据格式(你不在这里)%s,scanf否则永远不要使用裸(无界).
否则,您打开代码来缓冲溢出.
你应该做的是fgets从stdin(因为这提供缓冲区溢出保护)然后简单sscanf的线路.
这有额外的好处,你可以使用sscanf更长的四参数格式字符串,如果失败,则尝试使用双参数字符串.
像这样的东西:
#include <stdio.h>
int main (void) {
char buffer[200];
int i1, i2, i3, count;
printf("Please enter input in format: (-blackwhite | -color) colorvalue: ");
fflush (stdout);
if (fgets (buffer, sizeof (buffer), stdin) != NULL) {
if ((count = sscanf (buffer, " -color %d %d %d", &i1, &i2, &i3)) != 3)
count = sscanf (buffer, " -blackwhite %d", &i1);
switch (count) {
case 1: printf ("blackwhite %d\n", i1); break;
case 3: printf ("color %d %d %d\n", i1, i2, i3); break;
default: printf ("Huh?: %s\n", buffer); break;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)