如何使用sscanf仅使用stdio.h确保输入的字符串长度为1

时间:2014-10-22 03:03:13

标签: c arrays if-statement scanf

基本上我必须使用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;通过

2 个答案:

答案 0 :(得分:0)

使用"%[]"限制可接受的char。使用"%1[]"仅将长度限制为1 char"%*c"会扫描除char之外的任何1 '\0',因为sscanf()不会提供此charsscanf()返回值将为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';