检查输入是什么样的,然后使用scanf(C)
所以问题是用户可以给出一个整数的输入,或者用户可以给出一个三个整数的输入,这都取决于第一个输入。有点让人困惑,下面是一个例子:检查输入是什么样的,然后使用scanf(C),c,C,所以问题是用户可以给出一个整数的输入,或者用户可以给出一个三个整数的输入,这都取决于第一个输入。有点让人困惑,下面是一个例子: printf("Please enter input in this format: (-blackwhite | -color) colorvalue"); 用户输入“-blackwhite 40”所以我想 scanf("%s %u", charArray, &int); 但用户也可以输入“-color254 254 254”,然后我会想 scanf("%
printf("Please enter input in this format: (-blackwhite | -color) colorvalue");
用户输入“-blackwhite 40”所以我想
scanf("%s %u", charArray, &int);
但用户也可以输入“-color254 254 254”,然后我会想
scanf("%s %u %u %u", charArray, &int1, &int2, &int3);
我该怎么做呢?基本上,在我将数据扫描成变量之前先验证数据。读取字符串;将字符串与
-blackwhite
进行比较,如果匹配,则读取单个int
;否则,将字符串与-color
进行比较,如果匹配,则读取三个int
s;否则就对用户发牢骚
if (scanf("%40s", charArray) == 1)
{
if (strcmp(charArray, "-blackwhite") == 0)
{
if (scanf("%d", &int1) == 1)
...OK...
else
...error...
}
else if (strcmp(charArray, "-color") == 0)
{
if (scanf("%d %d %d", &int1, &int2, &int3) == 3)
...OK...
else
...error...
}
else
...error...
读字符串;将字符串与
-blackwhite
进行比较,如果匹配,则读取单个int
;否则,将字符串与-color
进行比较,如果匹配,则读取三个int
s;否则就对用户发牢骚
if (scanf("%40s", charArray) == 1)
{
if (strcmp(charArray, "-blackwhite") == 0)
{
if (scanf("%d", &int1) == 1)
...OK...
else
...error...
}
else if (strcmp(charArray, "-color") == 0)
{
if (scanf("%d %d %d", &int1, &int2, &int3) == 3)
...OK...
else
...error...
}
else
...error...
也许你应该先扫描单词,测试它,然后适当地扫描数字。也许你应该先扫描单词,测试它,然后适当地扫描数字。除非你完全控制输入数据格式(这里没有),否则千万不要在
scanf
中使用裸(无界)%s
否则,您将打开代码以防止缓冲区溢出
您应该做的是将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;
}
#包括
内部主(空){
字符缓冲区[200];
inti1,i2,i3,计数;
printf(“请输入格式:(-blackwhite |-color)colorvalue:);
fflush(stdout);
如果(fgets(buffer,sizeof(buffer,stdin)!=NULL){
如果((计数=sscanf(缓冲区,“-颜色%d%d”、&i1、&i2和&i3))!=3)
计数=sscanf(缓冲区,“-blackwhite%d”,&i1);
开关(计数){
案例1:printf(“黑白%d\n”,i1);中断;
案例3:printf(“颜色%d%d%d\n”,i1、i2、i3);中断;
默认值:printf(“Huh?:%s\n”,缓冲区);中断;
}
}
返回0;
}
除非您完全控制输入数据格式(此处没有),否则切勿在scanf
中使用裸(无界)%s
否则,您将打开代码以防止缓冲区溢出
您应该做的是将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;
}
#包括
内部主(空){
字符缓冲区[200];
inti1,i2,i3,计数;
printf(“请输入格式:(-blackwhite |-color)colorvalue:);
fflush(stdout);
如果(fgets(buffer,sizeof(buffer,stdin)!=NULL){
如果((计数=sscanf(缓冲区,“-颜色%d%d”、&i1、&i2和&i3))!=3)
计数=sscanf(缓冲区,“-blackwhite%d”,&i1);
开关(计数){
案例1:printf(“黑白%d\n”,i1);中断;
案例3:printf(“颜色%d%d%d\n”,i1、i2、i3);中断;
默认值:printf(“Huh?:%s\n”,缓冲区);中断;
}
}
返回0;
}
如果您的参数总是以“字符串输入”开头,然后是nx“整数输入”,您可以使用最大可能的整数输入数编写代码,因为scanf
将返回您填充的参数数。如果您的参数总是以“字符串输入”开头,然后是nx“整数输入”,您可以使用尽可能多的整数输入来编写代码,因为scanf
将返回您所填充的参数数。永远不要使用scanf:-)甚至不要想它。甚至可能不必尝试双参数版本。由于这两种形式的参数顺序相同,他可能只依赖于返回值4或2。就我个人而言,我会先做更多的验证,避免所有的scanf()
变体。事实上,虽然它在坏人手中很危险,但它可以安全使用。但决不要使用无界的%s
。通常最好是完全远离它,除非你非常清楚它的缺点。永远不要使用scanf:-)甚至不要想它。甚至可能不必尝试两个参数的版本。由于这两种形式的参数顺序相同,他可能只依赖于返回值4或2。就我个人而言,我会先做更多的验证,避免所有的scanf()
变体。事实上,虽然它在坏人手中很危险,但它可以安全使用。但决不要使用无界的%s
。通常最好是完全远离它,除非你非常清楚它的缺点。