C跳过一个函数的命令?

mjo*_*dri 2 c scanf

我正在编程模拟,当用户选择创建新标签时,用户应该输入标签ID,标签的所有者以及标签所代表的对象.程序正在做的只是跳过扫描所有者的命令,我不太清楚为什么.我的代码如下(函数在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);
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 9

第1点 [程序错误]

这里的问题是%c格式说明符的用法.它计算先前输入的\n,通过ENTER在上一次输入后按键存储.你想要的是什么

scanf(" %c", &tag[i].owner);
       ^
       |
    note the space
Run Code Online (Sandbox Code Playgroud)

\n在实际输入之前跳过任何前导空格,如字符(包括).

第2点 [逻辑错误]

根据你的代码在这里,以扫描一个字符串输入,你需要使用%s格式说明.

所以,最后,你的代码看起来应该是这样的

   scanf("%s", tag[i].owner);    // if tag[i].owner is char array
Run Code Online (Sandbox Code Playgroud)

要么

  scanf(" %c", &tag[i].owner);    // if tag[i].owner is a char, just in case
Run Code Online (Sandbox Code Playgroud)