从C中的stdio扫描字符串和整数

时间:2019-04-01 14:36:17

标签: c scanf

我正在尝试从stdio读取以下格式的两个整数和一个字符串输入:

22 CHEESE 2

分为两个不同的int变量和一个字符串变量,如下所示。

        int newId, newQuantity;
        char newName[20];
        scanf("%d %s %d",&newId, newName, &newQuantity);

代码正确地读取了字符串,但是在输入输入后,当我测试查看newId和newQuantity的值是什么时,它们始终是这些大整数,它们从来都不是我输入的。我通过修改代码以显示以下内容来检查输入中的更改:

        int newId, newQuantity;
        char newName[20];
        scanf("%d %s %d",&newId, newName, &newQuantity);
        printf("%d %s %d",&newId, newName, &newQuantity);

例如,当我输入22 CHEESE 2时,它将打印-1957382872 CHEESE -1957382868。我想知道是否有任何方法可以纠正这个问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

printf("%d %s %d",&newId, newName, &newQuantity)是错误的,应该为printf("%d %s %d",newId, newName, newQuantity),如果您启用了编译器警告,就会发现这一点。

以下是警告:

$ gcc main.c -Wall -Wextra
main.c: In function ‘main’:
main.c:7:18: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("%d %s %d",&newId, newName, &newQuantity);
                 ~^        ~~~~~~
                 %ls
main.c:7:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘int *’ [-Wformat=]
         printf("%d %s %d",&newId, newName, &newQuantity);
                       ~^                   ~~~~~~~~~~~~
                       %ls

这个问题是一个完美的例子,说明为什么在提出问题时总是要提供mcve。问题不在您想像的地方,而是在代码中您最初并未向我们展示。这也是为什么您应该启用编译器警告并阅读它们的完美示例。它们通常提供非常好的线索。警告是编译器说“此代码是有效的,但可能无法满足您的要求”。