sscanf出人意料的结果

时间:2012-11-26 17:15:26

标签: c scanf

#include<stdio.h>
#include<string.h>

int main()
{
   char buffer[32];
   char c;
   int i;
   printf("input: ");
   fgets(buffer, 32, stdin);
   printf("items filled: %d\n", sscanf("%c%d\n", &c, &i));
   printf("%c%d\n", c, i);
   return 0;
}

当输入一个后跟数字“f7”的字符时,我希望“f”进入变量c,而“7”进入变量i。出于某种原因,sscanf()无法填充两者,我得到了他们的初始垃圾值。我做错了什么?

4 个答案:

答案 0 :(得分:6)

实际sscanf()签名是这样的:

int sscanf(const char *str, const char *format, ...);

检查您使用了错误签名的sscanf()签名

应该是

sscanf(buffer,"%c%d\n", &c, &i);

答案 1 :(得分:3)

您未在sscanf()电话中使用缓冲区,因此它们未被填充。

int i;
char c;
char buffer[32];
fgets(buffer, 32, stdin);
sscanf(buffer, "%c%d", &c, &i)
         ^
      you're missing this part

答案 2 :(得分:3)

请勿使用sscanf。正在尝试进行解析的正确方法是

#include <stdlib.h>
#include <stdio.h>

// ...

char *endptr, buffer[32];
char c;
int i;

// ...

fgets(buffer, 32, stdin);
c = buffer[0];
i = strtol(buffer+1, &endptr, 10);

if (endptr == buffer+1 || (*endptr != '\0' && *endptr != '\n')) {
    puts("invalid input");
    return 1;
} else {
   printf("%c%d\n", c, i);
   return 0;
}

答案 3 :(得分:1)

永远不会告诉

sscanf("%c%d\n", &c, &i)查看缓冲区中的c和i,看起来你正在调用此调用。