scanf AFTER fgets打破了fgets语句

时间:2014-10-03 01:31:48

标签: c scanf fgets

我已经看过各种关于如何在fgets之前使用scanf的帖子可能会导致问题。但是,对我来说,添加它之后为什么会导致第一个语句破坏是没有意义的。

这就是我所拥有的:

  unsigned char key;
  unsigned char message[100];

  printf(" Please input a message \n  ");
  fgets(message, MAX_BUF, stdin); 
  printf("Your message is:  %s \n", message);


  // Read user input for message
  printf(" Please input a numeric key\n  ");
  scanf("%d", &key);

  printf("Your message is:  %s \n", message);
  printf("strlen(message) = %d \n", strlen(message));

这是"试运行":

  Please input a message
   hello
   Your message is: hello

  Please input a numeric key
   123

  Your message is: 
  strlen(message) = 0

就像这样,无论输入如何,消息变量都会变空。但是,如果我用scanf注释掉这一行,一切正常(除了我不能指定键)。

帮助!

1 个答案:

答案 0 :(得分:1)

%d scanf()格式说明符是一个承诺,即下一个参数是内存缓冲区的地址,该缓冲区足够大以容纳int(通常为4或8个字节) ,但是你的key只是一个1字节unsigned char,所以scanf()将在结束时写入3个(或者7个)字节,践踏占用该内存的任何内容 - 在这种情况下,很可能message。它究竟写入的内容将取决于系统的字节序,但对于小端系统(例如x86)上的小输入(< = 255),它的第二个字节(将写入{{1的第一个字节) }}将为0,它在零长度上有效地终止message