3
#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”进入 variable c,而“7”进入 variable i。出于某种原因,sscanf()两者都无法填充,我得到了它们的初始垃圾值。我究竟做错了什么?

4

4 回答 4

6

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

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

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

它应该是

sscanf(buffer,"%c%d\n", &c, &i);
于 2012-11-26T17:17:53.653 回答
3

您没有在sscanf()通话中使用缓冲区,因此它们没有被填满。

int i;
char c;
char buffer[32];
fgets(buffer, 32, stdin);
sscanf(buffer, "%c%d", &c, &i)
         ^
      you're missing this part
于 2012-11-26T17:18:57.383 回答
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;
}
于 2012-11-26T17:20:20.747 回答
1

sscanf("%c%d\n", &c, &i)从未被告知要在缓冲区中查找 c 和 i,看起来您正在错误地进行此调用。

于 2012-11-26T17:19:32.790 回答