用C中的整数检查用户输入时出错

用C中的整数检查用户输入时出错,c,C,我试图获取用户输入的格式为#1、#2、#3的RGB代码。我错误检查输入,以确保它与“,”格式匹配,并且可以从字符串中提取数字。但是,我在检查输入是否为之后的数字时遇到问题 例如:如果用户输入:255,0,0,程序仍在运行 任何帮助都将不胜感激 char input[100]; printf("Enter RGB code \n"); scanf(" %[^\n]s", input); //function to error check ', ' format int c1,c2,c3; //

我试图获取用户输入的格式为#1、#2、#3的RGB代码。我错误检查输入,以确保它与“,”格式匹配,并且可以从字符串中提取数字。但是,我在检查输入是否为之后的数字时遇到问题

例如:如果用户输入:255,0,0,程序仍在运行

任何帮助都将不胜感激

char input[100];
printf("Enter RGB code \n");
scanf(" %[^\n]s", input);

//function to error check ', ' format

int c1,c2,c3;
//formats the input into three ints. 
sscanf(input, "%d, %d, %d\n", &c1,&c2,&c3);

我只需要检查这些实际上是否是整数

如果您想进行任何严肃的格式检查,我建议您将它们合并到代码中。然后,您只需获取一行代码(比您当前的代码更可靠(
scanf
is可能不可靠),例如来自的代码),然后使用正则表达式,如:

^\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*$
检查并提取所需字段,每个字段为一到三(含)位

然后可能需要检查提取的字段是否小于256,但这应该相对容易。或者,如果您希望所有这些都由正则表达式本身完成,您可以将上述正则表达式中出现的
(\d{1,3})
替换为:

(0|[1-9]\d?|1\d\d|2[0-4]\d|25[0-5])
这保证了字段中有一个
0..255
数字,而不是任意的一到三位数,使用以下可能性:

0          : 0
[1-9]\d?   : 1-99
1\d\d      : 100-199
2[0-4]\d   : 200-249
25[0-5]    : 250-255

一种至少应该更加稳健的方法:

char输入[100];
/*使用fgets——这是阅读一行的更安全的方式。
scanf(“%[^\n]”,输入);可能导致缓冲区溢出*/
fgets(输入,sizeof(输入),标准输入);
int c1、c2、c3、end;
/*检查sscanf的返回值,确保我们读取的是三个整数。
然后,我们使用%n检查是否读取到字符串的末尾。
%n之前的\n跳过字符串末尾的所有空白。
*/
如果(sscanf(输入,“%d,%d,%d\n%n”、&c1、&c2、&c3、&end)!=3 | |输入[end]!=“\0”){
printf(“无效输入!\n”);
}
...

其作用:使用
fgets
读取一行(与
scanf
不同,更安全且无缓冲区溢出),然后使用
sscanf
解析它。在这里,我使用了
%n
格式选项,它将到目前为止读取的字符数写入相应的
int
参数(这里,
end
)。然后,我们只需检查是否到达字符串的末尾——如果没有,则必须有尾随垃圾,以便我们可以拒绝输入。此外,我们还检查
sscanf
的返回值,以确保它已准确读取三个数字(
%n
不计数)。

确定。因此,在将输入值放入c1、c2和c3整数变量之前,需要检查字符数组输入中的输入值是否实际上是数字。好主意

C语言中有一个函数可以帮助您实现这一点,除非您想编写自己的函数(这里我不冒昧地介绍这个函数,但如果您喜欢的话,您可能需要研究Ascii表)。它被称为isdigit,您可以在此处了解更多信息:。它的形式为int-isdigit(int-c),如果传递的参数是数字,则返回非零值。您可以将输入数组中的字符值传递给它,例如isdigit(input[x]);
其中x是字符在字符数组输入中的位置。希望这能有所帮助。

除非您正在键入format
“%[^\n]s”
的末尾没有
,除非您正在键入format
“\1、\2、\3s”
——将其删除
:)
转换说明符是
%[…]
。此外,您不能正确使用任何用户输入功能或转换功能,除非您检查返回。。。使用
fgets(input,sizeof input,stdin)
而不是
scanf(“%[^\n]s”,input)--消除
scanf
陷阱。(同时从
%d,%d,%d\n“
中删除
'\n'
)“我会错误检查输入,以确保它与“,”格式“->匹配,因为它不会检查
scanf()
的返回值。