我已经看过各种关于如何在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注释掉这一行,一切正常(除了我不能指定键)。
帮助!
答案 0 :(得分:1)
%d
scanf()
格式说明符是一个承诺,即下一个参数是内存缓冲区的地址,该缓冲区足够大以容纳int
(通常为4或8个字节) ,但是你的key
只是一个1字节unsigned char
,所以scanf()
将在结束时写入3个(或者7个)字节,践踏占用该内存的任何内容 - 在这种情况下,很可能message
。它究竟写入的内容将取决于系统的字节序,但对于小端系统(例如x86)上的小输入(< = 255),它的第二个字节(将写入{{1的第一个字节) }}将为0,它在零长度上有效地终止message
。