2016-11-07 37 views
1

我想将用户输入流中的值赋给变量M和N.如果我指定了M和N类型的int,我可以让我的代码工作。但是,当我使用stdint.h指定它们为int16_t时,它将读取第一个值,但不会读取最后一个值。为什么是这样?为什么类型int使用sscanf但int16_t不能?

这里的代码工作就好了... ...

#include <stdio.h> 
#include <stdint.h> 
int main(void) 
{ 
    char str[10]; 
    int M, N; 
    fgets(str, 10, stdin); 
    sscanf(str, "%d%d", &M, &N); 
    printf("M is: %d\n", M); 
    printf("N is: %d\n", N); 
    return 0; 
} 

这是行不通的。

#include <stdio.h> 
#include <stdint.h> 
int main(void) 
{ 
    char str[10]; 
    int16_t M, N; 
    fgets(str, 10, stdin); 
    sscanf(str, "%d%d", &M, &N); 
    printf("M is: %d\n", M); 
    printf("N is: %d\n", N); 
    return 0; 
} 
+1

[printf格式说明符for uint32 \ _t和size \ _t]的可能重复(http://stackoverflow.com/questions/3168275/printf-format-specifiers-for-uint32-t-and-size-t) –

+1

tl; dr您没有使用正确的格式说明符。 –

+0

如果您认为任何答案已解决您的问题,请考虑接受它(答案左侧的绿色复选标记)。这将向社区表明,该问题已得到解答,并将为您和回答者提供一些声誉。 – 2501

回答

7

您对int16_t类型使用了错误的说明符,因此行为未定义。

在scanf使用时int16_t正确说明符SCNd16:

sscanf(str, "%"SCNd16" %"SCNd16, &M, &N); 

而对于在printf说明符PRId16。它的用法是一样的。

相关问题