基本上我必须使用if语句:
char post[2];
if ((1 == sscanf(origstr, "%1d%1s", num,post)) && (*num>0) && (*num<8))
问题是当我输入&#39; 5&#39;或者&#39; 5&#39;,当我希望if语句为假时,它仍然是真的。顺便说一句:我在这里发帖,所以用户无法输入4.5。因为当他们这样做时,4会进入num和&#39;。进入post [0]会使sscanf == 2。
为清楚起见: 我想要&#39; 5&#39;,&#39; 5&#39;,&#39; 5&#39;等失败if语句 我只想要&#39; 1&#39; 2&#39;,...,&#39; 7&#39;通过
答案 0 :(得分:0)
使用"%[]"
限制可接受的char
。使用"%1[]"
仅将长度限制为1 char
。 "%*c"
会扫描除char
之外的任何1 '\0'
,因为sscanf()
不会提供此char
。 sscanf()
返回值将为0,1或2. 2意味着太多,0意味着'1'
到'7'
。
char numbuf[2];
char post;
if (sscanf(origstr, "%1[1234567]%c", numbuf, &post) == 1) {
// Good
num = numbuf[0] - '0';
}
或者
char num;
char post;
if ((sscanf(origstr, "%c%c", &num, &post) == 1) && (num >= '1') &&
(num <= '7')) {
// Good
num = num - '0';
}
或者
int num;
int n;
if ((sscanf(origstr, "%d%n", &num, &n) == 1) && (num >= 1) && (num <= 7) &&
(n == 1)) {
// Good
}
或者
int num;
int n;
if ((sscanf(origstr, "%o%n", &num, &n) == 1) && (num >= 1) && (n == 1)) {
// Good
}
答案 1 :(得分:0)
最好采用以下方式,而不是坚持使用sscanf更轻松的处理方式,易于理解和轻松。
if(*origstr && '0' < *origstr && *origstr < '8' && !origstr[1])//origstr[1] == '\n' ?
sscanf(origstr, "%d", num);//*num = origstr - '0';