C omitiendo un comando de una función?

Estoy progtwigndo una simulación, y cuando el usuario elige crear una nueva etiqueta, se supone que el usuario debe ingresar una ID de etiqueta, el propietario de la etiqueta y el objeto que representa la etiqueta. Lo que el progtwig está haciendo es omitir el comando que escanea para el propietario, y no estoy muy seguro de por qué. Mis códigos están debajo (las funciones están en iotlib.cpp):

iotlib.cpp

#include  #include  #include  #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; i1 && 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  #include  #include  #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(numTags5) { 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(numEvents5) { 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(); } 

Punto 1 [Error programático]

El problema aquí es el uso con el especificador de formato %c . Cuenta el \n ingresado previamente, almacenado al presionar la tecla ENTER después de la entrada anterior. Lo que quieres es

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

para omitir cualquier carácter principal en blanco (como \n ) antes de la entrada real.

Punto 2 [Error lógico]

Según su código aquí, para escanear una entrada de cadena , debe usar %s especificador de formato %s .

Entonces, finalmente, tu código debería verse como

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

o

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

% c es el especificador de un personaje, estás intentando ingresar una cadena, no un personaje. Vea la documentación de escaneo . Lo que quiere usar es el especificador% s para una cadena.