2014-10-03 27 views
-2

我见过在fgets可能会导致问题之前如何使用scanf的各种帖子。但是,为什么在添加它之后添加它会导致第一条语句中断,这是毫无意义的。scanf后fgets打破fgets声明

这是我有:

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注释掉了一行,那么一切正常(除非我不能分配密钥)。

帮助!

+4

对于只在程序中稍后运行的代码,不应该有可能返回并更改以前的输出。因此,请使用您的问题上的编辑按钮来提供[“最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)”。没有人,不可能确切地知道你的定义是什么,或者是什么可能导致你所看到的问题。 – HostileFork 2014-10-03 01:48:31

+0

重要的是报告'fgets()'和'scanf()'的返回值以帮助理解问题。显示你的输入有帮助。 – chux 2014-10-03 01:48:51

+0

感谢您的评论,这是我在Stack Overflow中的第一个问题,所以我对帖子的不完整性表示歉意。我编辑过它,希望现在好。 – 2014-10-04 17:59:37

回答

1

%d格式说明scanf()是一个承诺将下一个参数是存储器缓冲器,其足够大以容纳一个int(通常是4或8个字节)的地址,但你key仅仅是一个1字节unsigned char ,因此scanf()会在结尾处写入3个(或者可能是7个)字节,践踏占用内存的任何内容 - 在这种情况下,很可能是message。究竟写入的内容取决于系统的字节顺序,但对于小端系统(例如x86)的小输入(< = 255),其第二个字节(将写入message的第一个字节)将是0,其实际上零终止message零长度。

+0

'%d'是下一个参数*实际上是指向int *的指针的承诺。做任何事情(即使大小合适)都会导致未定义的行为,尽管您可能会忽略它。 – 2014-10-04 20:35:36

+0

谢谢。 %u还没有工作后,我已切换到%d。我刚刚发现正确的格式说明符是%hhu。 – 2014-10-05 18:37:13

+0

@PabloPrado:很高兴你解决了这个问题。如果我的回答很有帮助,请将其加入并/或标记为已接受的答案:) – 2014-10-05 19:14:28