C skipping one command of a function?

2019-01-01 02:33发布

问题:

I am programming a simulation, and when the user chooses to create a new tag, the user is supposed to enter a tag ID, the tag\'s owner, and the object the tag represents. What the program is doing is just skipping over command that scans for the owner, and I\'m not quite sure why. My codes are below (the functions are in iotlib.cpp):

iotlib.cpp

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 20

struct tagInfo
{
    char owner[MAX];
    char object[MAX];
    int id;
};
struct tre //TRE = Tag Read Event
{
    int id;
    char node[MAX];
    int dx;
};
void initTag(struct tagInfo tag[], int numTags)
{
    for(int i=0; i<numTags; i++)
    {
        printf(\"Enter the tag ID number: \");
        scanf(\"%i\", &tag[i].id);
        printf(\"Enter owner of tag: \");
        scanf(\"%c\", &tag[i].owner);
        printf(\"Enter the object the tag is attached to: \");
        scanf(\"%c\", &tag[i].object);
    }
}

void generateTRE(struct tre event[], int numEvents)
{
    for(int i=0; i<numEvents; i++)
        {
            printf(\"Enter tag ID: \");
            scanf(\"%i\", &event[i].id);
            printf(\"Enter node: \");
            scanf(\"%c\", &event[i].node);
            printf(\"Enter distance from node as an integer number of feet: \");
            scanf(\"%c\", &event[i].dx);
        }
}

void triangulationSimulate(struct tre event1, struct tre event2, int numEvents)
{
    if(numEvents>1 && event1.id==event2.id)
    {
        printf(\"Node %c\", event1.node);
        for(int i=0; i<event1.dx; i++)
        {
            printf(\" \");
        }

        printf(\"Tag %i\", event1.id);

        for(int i=0; i<event2.dx; i++)
        {
            printf(\" \");
        }

        printf(\"Node %c\", event2.node);
    }
}

void getTagInfo(struct tagInfo tag)
{
    printf(\"The tag with ID %i represents a/an %c belonging to %c\", tag.id, tag.object, tag.owner);
}

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include \"iotlib.cpp\"

void execute();

int main(void)
{
    execute();


    return 0;
}

void execute()
{
    struct tagInfo tags[5];
    struct tre events[5];
    int choice, numTags, numEvents;
    printf(\"!Simulation supports a maximum of 5 tags and 5 nodes!\\n\\n\");
    printf(\"Choose a function by entering it\'s number:\\n1. Create tags\\n2. Generate Tag Read Events\\n3. Triangulate tag\\n4. Recall tag metadata\\n\\n\");
    scanf(\"%i\", &choice);
    if(choice==1)
    {
        printf(\"Enter the number of tags to initialize (max of 5): \");
        scanf(\"%i\", &numTags);
        if(numTags<1 || numTags>5)
        {
            printf(\"Invalid datum.\\n\");
        }
        else
        {
            initTag(tags, numTags);
        }
    }
    else if(choice==2)
    {
        printf(\"Enter the number of TRE\'s to be generated (max of 5: \");
        scanf(\"%i\", &numEvents);
        if(numEvents<1 || numEvents>5)
        {
            printf(\"Invalid datum.\\n\");
        }
        else
        {
            generateTRE(events, numEvents);
        }
    }
    else if(choice==3)
    {
        int eventX, eventY;
        printf(\"Enter two existing TRE numbers to use, separated by a space: \");
        scanf(\"%i %i\", &eventX, &eventY);
        triangulationSimulate(events[eventX], events[eventY], numEvents);
    }
    else if(choice==4)
    {
        int tagNum;
        printf(\"Enter a tag number: \");
        scanf(\"%i\", &tagNum);
        getTagInfo(tags[tagNum-1]);
    }
    else
    {
        printf(\"Invalid selection.\\n\");
    }

    execute();
}

回答1:

Point 1 [Programmatic error]

The problem here is the usage with %c format specifier. It counts the previously entered \\n, stored by pressing the ENTER key after previous input. What you want is

scanf(\" %c\", &tag[i].owner);
       ^
       |
    note the space

to skip any leading whitespace like character (including \\n) before the actual input.

Point 2 [Logical Error]

As per your code here, to scan a string input, you need to use %s format specifier.

So, finally, your code should look like

   scanf(\"%s\", tag[i].owner);    // if tag[i].owner is char array

or

  scanf(\" %c\", &tag[i].owner);    // if tag[i].owner is a char, just in case


回答2:

%c is the specifier for a character, you\'re trying to input a string, not a character. See scanf documentation. What you want to use is the %s specifier for a string.



标签: c scanf